记一次因更改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';
-------------------------------------------------
保持专注,只做一件事,做好这件事!@
-------------------------------------------------

浙公网安备 33010602011771号