2009-02-04 3 views
33

У меня есть база данных компонентов. Каждый компонент имеет определенный тип. Это означает, что между компонентом и типом существует взаимосвязь «один-к-одному». Когда я удаляю тип, я хотел бы удалить все компоненты, у которых есть внешний ключ этого типа. Но если я не ошибаюсь, удаление каскада удалит тип при удалении компонента. Есть ли способ сделать то, что я описал?Как использовать для удаления каскада в mysql?

ответ

53

Вот что вы могли бы включить в таблицу компонентов.

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 
) 

Просто помните, что вы должны использовать механизм хранения InnoDB: двигатель Хранение MyISAM по умолчанию не поддерживает внешние ключи.

+5

Н.Б., НА ОБНОВЛЕНИЕ КАСКАД, вероятно, является плохой идеей, если вы используете его для связывания первичного ключа, потому что он должен быть неизменным, и полагаясь на это, база данных может потребовать редизайна, но я предполагаю, что если вы связываете ее с уникальным, но не основным, внешним ключом, это нормально. – ThinkBonobo

1

Вы должны определить ограничения внешнего ключа как ВКЛ. УДАЛИТЬ КАСКАД.

Примечание: Необходимо использовать механизм хранения InnoDB, он по умолчанию не поддерживает отношения с внешними ключами.

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

использование этого SQL

DELETE T1, T2 T1 ОТ INNER JOIN T2 ON T1.key = T2.key когда условие

+0

Это не использует функциональность 'CASCADE', как задал op. – displayname

+4

Но он решает проблему без обновления существующей структуры базы данных. –