2009-02-04 4 views
33

J'ai une base de données de composants. Chaque composant est d'un type spécifique. Cela signifie qu'il existe une relation plusieurs-à-un entre un composant et un type. Quand je supprime un type, je voudrais supprimer tous les composants qui ont une clé étrangère de ce type. Mais si je ne me trompe pas, la suppression en cascade supprimera le type lorsque le composant est supprimé. Y a-t-il un moyen de faire ce que j'ai décrit?Comment utiliser delete cascade dans mysql?

Répondre

53

Voici ce que vous incluriez dans votre table de composants.

CREATE TABLE `components` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `typeId` int(10) unsigned NOT NULL, 
    `moreInfo` VARCHAR(32), 
    -- etc 
    PRIMARY KEY (`id`), 
    KEY `type` (`typeId`) 
    CONSTRAINT `myForeignKey` FOREIGN KEY (`typeId`) 
     REFERENCES `types` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) 

Rappelez-vous simplement que vous avez besoin d'utiliser le moteur de stockage InnoDB: le moteur de stockage par défaut MyISAM ne supporte pas les clés étrangères.

+5

NB, ON UPDATE CASCADE est probablement une mauvaise idée si vous l'utilisez pour lier une clé primaire, car elle devrait être immuable et s'appuyer sur cette base de données suggérée pourrait nécessiter une refonte, mais je suppose que si vous la liez avec une clé étrangère unique, mais pas primaire, c'est OK. – ThinkBonobo

1

Vous devez définir vos contraintes de clé étrangère comme ON DELETE CASCADE.

Remarque: Vous devez utiliser le moteur de stockage InnoDB, le moteur de stockage MyISAM par défaut ne prend pas en charge les relations de clés étrangères.

CREATE TABLE `table2` (
`id` int(11) NOT NULL auto_increment, 
`name` int(11) NOT NULL, 

PRIMARY KEY (`id`), 
KEY `ids` (`ids`) 
CONSTRAINT `foreign` FOREIGN KEY (`ids`) 
    REFERENCES `table2` (`ids`) ON DELETE CASCADE ON UPDATE CASCADE 
) 
1

utiliser cette sql

SUPPRIMER T1, T2 DE T1 INNER JOIN T2 T1.key = T2.key condition WHERE

+0

Ceci n'utilise pas la fonctionnalité 'CASCADE' comme demandé par op. – displayname

+4

Mais cela résout le problème sans mettre à jour la structure de base de données existante. –