MySQL:删除忽略外键约束的行

时间:2012-03-28 17:27:57

标签: mysql foreign-keys

所以我正在处理几个表,它们之间存在一些数据不一致...一个或两个表在特定表上有一个外键约束(称之为表X),但该表有多个行与外键栏。

我想要做的是删除表X中的重复行,但外键约束阻止我这样做。有没有办法强制删除行而忽略外键约束,因为我知道我在做什么?

4 个答案:

答案 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)

只需执行以下操作:

  1. 禁用外键检查

    SET foreign_key_checks = 0;

  2. 删除记录

    从table_name中删除{条件};

  3. 启用外键检查

    SET foreign_key_checks = 1;

信用:https://www.knowledgewalls.com/johnpeter/books/mysql/how-to-ignore-constraints-while-insertupdate-or-delete-records-in-mysql

答案 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;