我正在处理几个表格,它们之间存在一些数据不一致的问题... 其中一两个表格在特定表(称为X表)上有一个外键约束,但是该表中有多行具有外键列。
我的目标是删除X表中的重复行,但是外键约束阻止了我这样做。是否有一种方法可以强制删除这些行而忽略外键约束,因为我知道自己在做什么?
我正在处理几个表格,它们之间存在一些数据不一致的问题... 其中一两个表格在特定表(称为X表)上有一个外键约束,但是该表中有多行具有外键列。
我的目标是删除X表中的重复行,但是外键约束阻止了我这样做。是否有一种方法可以强制删除这些行而忽略外键约束,因为我知道自己在做什么?
SET foreign_key_checks = 0;
此外,您还可以删除外键,然后稍后再添加它,以仅影响单个键
ALTER TABLE tableName DROP FOREIGN KEY fk;
请按照以下步骤进行操作:
禁用外键检查
SET foreign_key_checks = 0;
删除你的记录
DELETE FROM table_name WHERE {conditions};
启用外键检查
SET foreign_key_checks = 1;
正如一些人已经指出的那样,忽略限制外键会导致数据库不一致。在这种情况下,防止DELETE
是你想要的。
在执行主查询之前,最好先删除相关行:
DELETE FROM cities WHERE country_id=3;
-- Afterwards you delete rows from the parent table without error:
DELETE FROM countries WHERE country_id=3;
ALTER TABLE cities DROP FOREIGN KEY `fk.cities.country_id`;
ALTER TABLE cities ADD CONSTRAINT `fk.cities.country_id` FOREIGN KEY (country_id)
REFERENCES countries (id) ON UPDATE CASCADE ON DELETE CASCADE;
-- From now on, just delete from the parent table:
DELETE FROM countries WHERE country_id=3;
对于已接受的答案进行扩展,您必须在DROP FOREIGN KEY
之后指定约束名称。
您可以通过发出SHOW CREATE TABLE
来检查约束名称。
> SHOW CREATE TABLE tbl_name
Create Table: CREATE TABLE `tbl_name` (
`id` int(11) DEFAULT NULL,
`foo_id` int(11) DEFAULT NULL,
CONSTRAINT `foo_ibfk_1` FOREIGN KEY (`foo_id`)
)
ALTER TABLE tableName DROP FOREIGN KEY foo_ibfk_1;