2009-02-04 30 views
33

Mam bazę danych komponentów. Każdy komponent ma określony typ. Oznacza to, że istnieje relacja wiele do jednego między komponentem a typem. Kiedy usuwam typ, chciałbym usunąć wszystkie komponenty, które mają klucz obcy tego typu. Ale jeśli się nie mylę, usuwanie kaskadowe usunie typ, gdy komponent zostanie usunięty. Czy istnieje sposób na to, co opisałem?Jak korzystać z kaskady usuwania w mysql?

Odpowiedz

53

Oto, co należy uwzględnić w tabeli komponentów.

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 
) 

Wystarczy pamiętać, że trzeba skorzystać z mechanizmu składowania InnoDB: silnik magazyn domyślny MyISAM nie obsługuje kluczy obcych.

+5

NB, ON UPDATE CASCADE jest chyba zły pomysł, jeśli używasz go do połączenia klucza głównego, ponieważ powinien on być niezmienny, a poleganie na tym sugeruje, że baza danych może wymagać przeprojektowania, ale domyślam się, że jeśli łączysz go z kluczem obcym, który jest unikalny, ale nie podstawowy, jest w porządku. – ThinkBonobo

1

Musisz zdefiniować ograniczenia klucza obcego jako NA KASKU DELETE.

Uwaga: Musisz użyć silnika pamięci InnoDB, domyślny silnik pamięci masowej MyISAM nie obsługuje relacji kluczy obcych.

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

użycie tego sql

DELETE t1, t2 FROM T1 INNER JOIN T2 T1.key = T2.key WHERE warunek

+0

To nie używa funkcji 'CASCADE', o którą prosił op. – displayname

+4

Ale to rozwiązuje problem bez aktualizacji istniejącej struktury bazy danych. –

Powiązane problemy