所以我正在处理几个表,它们之间存在一些数据不一致...一个或两个表在特定表上有一个外键约束(称之为表X),但该表有多个行与外键栏。
我想要做的是删除表X中的重复行,但外键约束阻止我这样做。有没有办法强制删除行而忽略外键约束,因为我知道我在做什么?
答案 0 :(得分:117)
SET foreign_key_checks = 0;
这将阻止MySQL检查外键。完成后,请确保将其重新设置为1.
此外,您可以随时删除外键,如果您只想影响单个键,则稍后再添加外键
ALTER TABLE tableName DROP FOREIGN KEY fk;
答案 1 :(得分: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;
答案 2 :(得分:0)
只需执行以下操作:
禁用外键检查
SET foreign_key_checks = 0;
删除记录
从table_name中删除{条件};
启用外键检查
SET foreign_key_checks = 1;
答案 3 :(得分:0)
要扩展已接受的答案,您必须在 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`)
)
在这种情况下,“foo_ibfk_1”是约束名称。所以你可以写:
ALTER TABLE tableName DROP FOREIGN KEY foo_ibfk_1;