【问题标题】:MySQL: delete a row ignoring foreign key constraintMySQL:删除忽略外键约束的行
【发布时间】:2012-04-12 08:23:09
【问题描述】:

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

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

【问题讨论】:

  • 请注意,使用 SET foreign_key_checks = 0 时可能会弄乱您的数据库。只有在您确切知道结果如何时才使用它。我只将它用于我的 php 备份脚本。
  • 当然,这样做会很危险,只有在我知道自己在做什么的时候才会使用它。

标签: mysql foreign-keys


【解决方案1】:

SET foreign_key_checks = 0;

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

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

ALTER TABLE tableName DROP FOREIGN KEY fk;

【讨论】:

  • 如果您立即退出会话,我猜您不必将外键检查设置回 1。
  • 我有多个表,所以我想从所有表中删除这个字段,所以我该怎么做。这不起作用
  • 请记住,这将留下孤立的行,它不会强制删除任何子记录。
  • 你可能想在之后运行integrity check
  • SET foreign_key_checks = 0;对我不起作用。我仍然收到Cannot delete or update a parent row: a foreign key constraint fails 错误。
【解决方案2】:

简单执行如下:

  1. 禁用外键检查

    SET foreign_key_checks = 0;

  2. 删除您的记录

    DELETE FROM table_name WHERE {条件};

  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】:

    正如一些人已经指出的那样,忽略限制性外键会给您带来数据库不一致的问题。在这种情况下,您需要阻止DELETEs。

    您最好在主查询之前删除相关行:

    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;
    

    【讨论】:

      【解决方案4】:

      要扩展已接受的答案,您必须在 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-02
        • 2011-02-24
        • 1970-01-01
        相关资源
        最近更新 更多