У меня есть база данных компонентов. Каждый компонент имеет определенный тип. Это означает, что между компонентом и типом существует взаимосвязь «один-к-одному». Когда я удаляю тип, я хотел бы удалить все компоненты, у которых есть внешний ключ этого типа. Но если я не ошибаюсь, удаление каскада удалит тип при удалении компонента. Есть ли способ сделать то, что я описал?Как использовать для удаления каскада в mysql?
ответ
Вот что вы могли бы включить в таблицу компонентов.
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 по умолчанию не поддерживает внешние ключи.
Вы должны определить ограничения внешнего ключа как ВКЛ. УДАЛИТЬ КАСКАД.
Примечание: Необходимо использовать механизм хранения 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
)
использование этого SQL
DELETE T1, T2 T1 ОТ INNER JOIN T2 ON T1.key = T2.key когда условие
Это не использует функциональность 'CASCADE', как задал op. – displayname
Но он решает проблему без обновления существующей структуры базы данных. –
Н.Б., НА ОБНОВЛЕНИЕ КАСКАД, вероятно, является плохой идеей, если вы используете его для связывания первичного ключа, потому что он должен быть неизменным, и полагаясь на это, база данных может потребовать редизайна, но я предполагаю, что если вы связываете ее с уникальным, но не основным, внешним ключом, это нормально. – ThinkBonobo