我想在已填充数据的现有表上添加 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
不匹配的所有行types
。id
首先,我们将制作一个选择查询以确保我们选择了正确的行:
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
现在我们有一张准备添加外键的表。