IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Problème de foreign key sur un DELETE


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Points : 13
    Points
    13
    Par défaut Problème de foreign key sur un DELETE
    Bonjour à tous,

    J'ai un souci très bloquant concernant 3 tables. Deux d'entres elles ont comme Foreign Key la Primary Key de celle qui reste. Cf ci dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    T1 [
       t1_pk;
    ]
     
    T2[
      t2_pk 
      t2_fk references t1_pk ON DELETE CASCADE ON UPDATE CASDADE;
    ]
     
    T3[
      t3_pk 
      t3_fk references t1_pk ON DELETE CASCADE ON UPDATE CASDADE;
    ]
    Lorsque je fait un delete ou un update sur T1, Le sgbd (sqlite) m'indique une erreur "foreign key mismatch". Pourtant les occurence de T1.t1_pk sont bien dans T2 et T3!

    Avez vous une idée?

    Merci d'avance

  2. #2
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Les tables sont de type InnoDB ?

  3. #3
    Membre à l'essai
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Comment le savoir? Je peux te dire que la gestion des foreign key est activée (possible depuis sqlite3)

  4. #4
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Donc Base de données= SQLITE ?

    Excusez moi, je pensais que votre question concernait MySQL

  5. #5
    Membre à l'essai
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par Yanika_bzh Voir le message
    Donc Base de données= SQLITE ?
    Exactement.

  6. #6
    Membre à l'essai
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    J'ai oublié de mentionner quelque chose d'important, les clés primaires de T2 et T3 sont en fait partiellement composées de leur clés étrangères, ce qui modifie le pseudo langage du post inital comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    T2[
      T2_id,
      T2_fk References t1_pk ON DELETE CASCADE ON UPDATE CASDADE,
      PK(T2_id, T2_fk)
    }
     
    T3[
      T3_id,
      T3_fk references t1_pk ON DELETE CASCADE ON UPDATE CASDADE,
      PK(T3_id, T3_fk)
    ]
    Est ce que ça donne d'autres idées?

  7. #7
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 102
    Points : 31 544
    Points
    31 544
    Billets dans le blog
    16
    Par défaut
    Quand vous écrivez :
    REFERENCES t1_pk
    t1_pk doit être le nom d'une table, or ce n'est pas le cas. Il faut écrire :
    REFERENCES T1

    Par ailleurs, si la colonne composant la clé primaire de la la table T1 s'appelle par exemple col_x, il faut écrire :
    REFERENCES T1 (col_x)


    En outre on n'écrit pas:
    ON UPDATE CASDADE
    Mais :
    ON UPDATE CASCADE

    Et prenez l'habitude de fournir des instructions moins floues que celles que vous avez présentées, on perdra moins de temps. Par exemple, en SQL normalisé :


    Code Sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE T1
    (
        T1_Id  INT NOT NULL
      , PRIMARY KEY (t1_Id)
    ) ;
     
    CREATE TABLE T2
    (
        T2_id INT NOT NULL 
     ,  T2_fk INT NOT NULL
     ,  PRIMARY KEY (T2_id, T2_fk)
     ,  FOREIGN KEY (T2_fk) REFERENCES T1 (T1_Id) ON DELETE CASCADE ON UPDATE CASCADE
    ) ;

  8. #8
    Membre à l'essai
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Désolé pour la forme rudimentaire du pseudo code, j'en prend note. Et les foreign keys sont écrites correctement!

    Le CASDADE est une faute de frappe, il a bien été écrit dans le code source.

    Je ne vois pas pourquoi il refuse l'UPDATE ou le DELETE sur T1

  9. #9
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Peut etre parce que T2_fk n'est pas indexé ??

Discussions similaires

  1. Problème avec foreign keys sur plusieurs colonnes
    Par draghysck dans le forum Requêtes
    Réponses: 1
    Dernier message: 12/10/2009, 14h27
  2. Foreign key sur clé primaire composée
    Par mona dans le forum Oracle
    Réponses: 6
    Dernier message: 13/10/2005, 22h36
  3. Foreign Key sur Mysql
    Par lemagicien dans le forum Outils
    Réponses: 1
    Dernier message: 23/09/2005, 13h39
  4. problème avec Foreign Key [Interbase 7.5] [Delphi 2005]
    Par xenos dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/09/2005, 11h21
  5. [débutant] Aide pour mettre une FOREIGN KEY sur une table
    Par cauldron dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/11/2004, 17h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo