mysql删除没有表副本的外键

mep*_*ips 5 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.

hen*_*rik 6

从MySQL 5.6开始,MySQL支持就地删除外键/无需复制.Oracle称之为在线DDL.

列出了所有Online DDL操作及其运行时行为.

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

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


Kam*_*zic 3

我认为没有一个好方法来删除该外键

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

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

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