我有一个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。
答案 0 :(得分:6)
从MySQL 5.6开始,MySQL支持在没有复制的情况下就地删除外键。 Oracle称之为在线DDL 。
此table列出了所有在线DDL 操作及其运行时行为。
根据我的经验,丢弃外键和600GB表上的相应约束几乎是即时的。 5.5可能需要几天时间。
我所知道的唯一缺点是5.6不允许你回收表空间。即如果您使用innodb_file_per_table
,则删除索引时该文件不会缩小。只有文件中的未使用的数据才会增长。您可以使用SHOW TABLE STATUS和Data_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。
我认为最好的方法是使用claims
从mysqldump
转储数据,重新创建表而不将外键引用到claim_details
,在SET foreign_key_checks = 0;
禁用密钥检查以防万一你有其他外键并导入claims
的数据。只记得为数据和结构进行单独的转储,这样就不需要编辑这个巨大的文件来从表创建语法中删除外键。