繁体   English   中英

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

[英]MySQL: delete a row ignoring foreign key constraint

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

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

SET foreign_key_checks = 0;

这将阻止 MySQL 检查外键。 但是,请确保在完成后将其设置回 1。

此外,如果您只想影响单个键,您可以随时删除外键,然后再添加它

ALTER TABLE tableName DROP FOREIGN KEY fk;

只需执行如下:

  1. 禁用外键检查

    SET foreign_key_checks = 0;

  2. 删除您的记录

    DELETE FROM table_name WHERE {conditions};

  3. 启用外键检查

    SET foreign_key_checks = 1;

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

正如一些人已经指出的那样,忽略限制性外键会导致数据库不一致。 在这种情况下,您需要防止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`)
)

在这种情况下,“foo_ibfk_1”是约束名称。 所以你可以写:

ALTER TABLE tableName DROP FOREIGN KEY foo_ibfk_1;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM