记一次因更改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';
posted @ 2024-01-08 08:46  逆水寒龙  阅读(12)  评论(0编辑  收藏  举报