mysql删除没有表副本的外键

时间:2011-09-03 16:20:18

标签: mysql foreign-keys alter-table

我有一个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。

2 个答案:

答案 0 :(得分:6)

从MySQL 5.6开始,MySQL支持在没有复制的情况下就地删除外键。 Oracle称之为在线DDL

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

根据我的经验,丢弃外键和600GB表上的相应约束几乎是即时的。 5.5可能需要几天时间。

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

答案 1 :(得分:2)

我认为删除该外键没有好办法

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

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

我认为最好的方法是使用claimsmysqldump转储数据,重新创建表而不将外键引用到claim_details,在SET foreign_key_checks = 0;禁用密钥检查以防万一你有其他外键并导入claims的数据。只记得为数据和结构进行单独的转储,这样就不需要编辑这个巨大的文件来从表创建语法中删除外键。