Rechercher : dans
Par :

SQL delete sur 2 tables avec foreign key

Dernière réponse le 8 avr 2009 à 15:10:44 toto, le 4 sep 2008 à 15:02:47 
 Signaler ce message aux modérateurs

Bonjour,

Mon probleme est un problème de foreign key
mes tables :
t1 tlink t2
---- ---- -----
id t1_id id
info t2_d info

ma requete
DELETE tlink, t2
FROM tlink, t2
WHERE tlink.t1_id = 39 AND tlink.t2_id = 15 AND t2.id = 15

mais quand je l execute j ai une erreur de foreign key. Dans l aide de mysql ils donnent comme indication de donner un ordre dans la déclaration des foreign key mais rien de plus. Je ne vois pas trop.

voila le code des creation de table :
CREATE TABLE `t1` (
`id` int(10) unsigned NOT NULL auto_increment,
`info` varchar(20) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `t2` (
`id` int(10) unsigned NOT NULL auto_increment,
`info` varchar(20) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `tlink` (
`t1_id` int(10) unsigned NOT NULL,
`t2_id` int(10) unsigned NOT NULL,
KEY `t1` (`t1_id`),
KEY `t2` (`t2_id`),
CONSTRAINT `tlink_FK_1` FOREIGN KEY (`t1_id`) REFERENCES `t1` (`id`),
CONSTRAINT `tlink_FK_2` FOREIGN KEY (`t2_id`) REFERENCES `t2` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



merci d avance pour les details du fonctionnement

Configuration: Windows XP
Internet Explorer 7.0

Meilleures réponses pour « SQL delete sur 2 tables avec foreign key » dans :
Manipulations élémentaires des tableaux sous MatLab VoirSommaire I. Stockage des tableaux II. L'indexation linéaire II.1. Accéder à un élément d'un tableau en utilisant l'indexation linéaire II.2. Passer d'une indexation à l'autre II.2.1. La fonction ind2sub II.2.2. La fonction sub2ind III. La...
SQL - Création de table VoirLe SQL, comportant un langage de définition de données (LDD), permet de créer des tables. Pour cela, il utilise le couple de mots clés CREATE TABLE. La création de tables Le création de tables se fait à l'aide du couple de mots-clés CREATE...
SQL - Modification de table VoirModification de table Il est possible de supprimer une table grâce à la clause DROP, il existe aussi des commandes moins extrêmes permettant L'ajout de colonnes La modification de colonnes La suppression de colonnes Enfin, il est possible...
SQL - Contraintes d'intégrité VoirExpression de contraintes d'intégrité Une contrainte d'intégrité est une clause permettant de contraindre la modification de tables, faite par l'intermédiaire de requêtes d'utilisateurs, afin que les données saisies dans la base soient...

1

basshero816, le 4 sep 2008 à 15:11:04

Salut,
Tu as un modèle conceptuel comprenant deux tables principales, et une table de liaison.
Donc, au départ, tu dois créer tes deux tables principales en premier, puis créer la table qui fait la liaison ensuuite.

Le processus de suppression est inverse.
Tu dois supprimer la table (ou seulement certains enregistrements) de la table de liaison, puis supprimer les tables principales.

Dans le cas présent, le mieux est de faire deux requêtes de suppression :

DELETE * FROM tlink WHERE tlink.t2_id = 15

DELETE * FROM t2 WHERE t2.id = 15

@+

Répondre à basshero816

2

toto, le 4 sep 2008 à 15:21:12

Je viens d essayer avec l exemple que j ai donnée ca marche mais pas pour ma vrai DB. Il doit avoir une différence donc je continue de chercher mais merci pour la reponse.

mais est ce qu il est possible de faire le delete en 1 requete?

ca m eviterais de gérer une transaction

Répondre à toto

3

basshero816, le 4 sep 2008 à 15:27:53

Après, tu peux peut-être essayer de faire le Delete sur une jointure, mais à mon avis ça ne marchera pas.

DELETE *
FROM t2 INNER JOIN tlink ON t2.id = tlink.t2_id
WHERE t2.id = 15;

@+

Répondre à basshero816

4

basshero816, le 4 sep 2008 à 15:32:03

Non, désolé, le Delete ne supporte pas la jointure...
Une autre solution est de faire une sous-requête qui simule une jointure.

Répondre à basshero816

5

 papymucho, le 8 avr 2009 à 15:10:44
  • +1

Le topic date un peu, mais je viens d'avoir le même problème, résolu après 3 minutes de recherche....

Donc si ça peut aider d'autres personnes qui passent ici :

Faut rajouter la clause ON DELETE CASCADE à la création de la foreign key ex avec un alert table :

ALTER TABLE table1 ADD FOREIGN KEY (id) REFERENCES table2 (id) ON DELETE CASCADE;

cordialement...

Répondre à papymucho