2009-02-04 15 views
33

Bileşen veri tabanım var. Her bileşen belirli bir tipte. Bu, bir bileşenle bir tür arasında çoktan-bir ilişki olduğu anlamına gelir. Bir türü sildiğimde, bu tür bir yabancı anahtar olan tüm bileşenleri silmek istiyorum. Ancak yanılmıyorsam, bileşen silindiğinde, çağlayan silme türü siler. Açıkladığım şeyi yapmanın bir yolu var mı?Mysql'deki silme kaskadında nasıl kullanılır?

cevap

53

Bileşen tablonuza neler yazacağınız.

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 
) 

Sadece InnoDB depolama motoru kullanmak gerekir unutmayın: Varsayılan MyISAM depolama motor yabancı anahtarları desteklemez.

+5

NB, GÜNCELLEME CASCADE muhtemelen kötü bir fikir eğer olduğunu ÜZERİNE Birincil anahtarı bağlamak için kullanıyorsunuz çünkü değişmez olmalı ve buna dayanarak veritabanı yeniden tasarlanmasını gerektirebilir, ama sanırım bunu benzersiz ama birincil olmayan bir yabancı anahtarla bağlarsanız tamamdır. – ThinkBonobo

1

Yabancı Anahtar kısıtlamalarınızı ON DELETE CASCADE olarak tanımlamanız gerekir.

Not: InnoDB depolama motorunu kullanmanız gerekiyor, varsayılan olarak MyISAM depolama altyapısı yabancı anahtar ilişkilerini desteklemiyor.

T1 İÇ DAN T1, T2 SİL

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

kullanımı bu sql T1.key = T2.key AÇIK T2 JOIN NEREDE durum

+0

Bu, op tarafından sorulduğu gibi 'CASCADE' işlevini kullanmaz. – displayname

+4

Ama mevcut veritabanı yapısını güncellemeden sorunu çözüyor. –