Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/08/2011, 15h09   #1
Invité de passage
 
Ingénieur développement logiciels
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 4
Points : 4
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 :
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
Timo31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 15h13   #2
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Les tables sont de type InnoDB ?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 15h21   #3
Invité de passage
 
Ingénieur développement logiciels
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 4
Points : 4
Comment le savoir? Je peux te dire que la gestion des foreign key est activée (possible depuis sqlite3)
Timo31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 15h24   #4
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Donc Base de données= SQLITE ?

Excusez moi, je pensais que votre question concernait MySQL
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 15h40   #5
Invité de passage
 
Ingénieur développement logiciels
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 4
Points : 4
Citation:
Envoyé par Yanika_bzh Voir le message
Donc Base de données= SQLITE ?
Exactement.
Timo31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 16h19   #6
Invité de passage
 
Ingénieur développement logiciels
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 4
Points : 4
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 :
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?
Timo31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 01h06   #7
Expert Confirmé Sénior

 
Avatar de fsmrel
 
Spécialiste en bases de données
Inscription : septembre 2006
Messages : 2 884
Détails du profil
Informations professionnelles :
Activité : Spécialiste en bases de données
Secteur : Conseil

Informations forums :
Inscription : septembre 2006
Messages : 2 884
Points : 5 118
Points : 5 118
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 :
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
) ;
__________________
_
Faites simple, mais pas plus simple ! (A. Einstein)
E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
=> La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

__________________

Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !)
fsmrel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 09h29   #8
Invité de passage
 
Ingénieur développement logiciels
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 4
Points : 4
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
Timo31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 09h37   #9
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Peut etre parce que T2_fk n'est pas indexé ??
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h57.


 
 
 
 
Partenaires

Hébergement Web