记一次因更改MySQL的表名称引起的外键引用错误引发的事故处理
场景:
MySQL更改原表名sys_org_element为sys_org_element_bak1导致了所有引用sys_org_element的表的id做外键的表全部引用了sys_org_element_bak1表,进而引发因外键导致的数据插入不了的问题。
解决办法:
一开始想到的是手动更改外键呗,结果发现有1000多个引用,太坑了,坑死自己吧。这条路是行不通了,能不能动态生成sql去自动搞,搜索之后发现还真行。
查询有多少表引用
SELECT CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = 'sys_org_element_bak1';
动态生成sql,先删除外键,然后再添加外键
SELECT CONCAT(" ALTER TABLE `",TABLE_NAME,"` DROP FOREIGN KEY `",CONSTRAINT_NAME,"`; ALTER TABLE `",TABLE_NAME,"` ADD CONSTRAINT `",CONSTRAINT_NAME,"` FOREIGN KEY (`",COLUMN_NAME,"`) REFERENCES `sys_org_element` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; ") sql1 FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = 'sys_org_element_bak1' AND REFERENCED_COLUMN_NAME = 'id';
-------------------------------------------------
保持专注,只做一件事,做好这件事!@
-------------------------------------------------