【问题标题】:mysql drop foreign key without table copymysql删除没有表副本的外键
【发布时间】:2011-11-09 19:02:08
【问题描述】:

我有一个 InnoDB 表 claims,它有大约 2.4 亿行。该表有一个外键约束:CONSTRAINT FK78744BD7307102A9 FOREIGN KEY (ID) REFERENCES claim_details (ID)。我想尽快删除表claim_details

根据一些实验,如果我使用SET foreign_key_checks = 0; drop claim_details 然后重新启用外键,mysql 将继续强制执行约束,即使表不再存在。所以,我相信我必须从表中删除约束。

我已尝试使用ALTER TABLE claims DROP FOREIGN KEY FK78744BD7307102A9 删除约束,并且查询已处于“复制到 tmp 表”状态超过 24 小时(在没有其他负载的机器上)。我不明白为什么删除约束需要制作表的副本。有什么办法可以预防吗?

mysql 版本 5.1.48。

【问题讨论】:

    标签: mysql foreign-keys alter-table


    【解决方案1】:

    我认为没有很好的方法来删除该外键

    http://dev.mysql.com/doc/refman/5.5/en/innodb-create-index-limitations.html

    “MySQL 5.5 不支持高效创建或删除 FOREIGN KEY 约束。因此,如果您使用 ALTER TABLE 添加或删除 REFERENCES 约束,则会复制子表,而不是使用快速索引创建。”这可能也指的是旧版本的mysql。

    我认为最好的方法是使用mysqldump 转储来自claims 的数据,重新创建没有引用claim_details 的外键的表,使用SET foreign_key_checks = 0; 禁用键检查以防您有其他外键并导入回来claims 的数据。请记住为数据和结构进行单独的转储,这样您就无需编辑这个巨大的文件来从表创建语法中删除外键。

    【讨论】:

    • 我不想删除索赔表。只有外键指向的 claim_details 表。
    【解决方案2】:

    从 MySQL 5.6 开始,MySQL 支持就地/不复制外键删除。 Oracle 将此称为在线 DDL

    table 列出了所有在线 DDL 操作及其运行时行为。

    根据我的经验,在 600GB 表上删除外键和相应的约束几乎是瞬间完成的。使用 5.5 可能需要几天时间。

    我知道的唯一缺点是,5.6 不允许您回收表空间。 IE。如果您使用innodb_file_per_table,则删除索引时该文件不会缩小。只有文件中未使用的数据会增长。您可以使用SHOW TABLE STATUSData_free 列轻松检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      相关资源
      最近更新 更多