MySQL 外键到现有表,删除子违规

MySQL 外键到现有表,删除子违规

我想在已填充数据的现有表上添加 FK,并在删除时使用级联。有人知道是否可以自动删除所有违反约束的数据,以便可以添加 FK,而无需手动清理数据库。谢谢。

答案1

这取决于我们所说的“自动”。
如果我们谈论的是 SQL 查询的执行,那么实现起来并不困难。
我们需要做的就是选择“错误”的行并删除它们。
如何做到这一点,最好举个例子。

假设我们有两张表:

CREATE TABLE `products` (
 `id` int(11) NOT NULL,
 `name` varchar(16) NOT NULL,
 `type` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `types` (
 `id` int(11) NOT NULL,
 `type` varchar(16) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

我们想向products表添加外键:

ALTER TABLE `products` 
  ADD CONSTRAINT `FK_some_key` FOREIGN KEY (`type`) REFERENCES `types` (`id`) 
    ON DELETE Cascade ON UPDATE Cascade

我们需要从products表中删除字段type不匹配的所有行typesid

首先,我们将制作一个选择查询以确保我们选择了正确的行:

SELECT `products`.*
FROM `products` LEFT JOIN `types`
ON `products`.`type` = `types`.`id`
WHERE `types`.`id` IS NULL

如果选择看起来没问题,则更改选择删除

DELETE `products`.*
FROM `products` LEFT JOIN `types`
ON `products`.`type` = `types`.`id`
WHERE `types`.`id` IS NULL

现在我们有一张准备添加外键的表。

相关内容