MYSQL数据库外键批量备份(还原)及批量删除外键

背景

在上一篇文章《便捷的批量修改MySQL数据库表及字段的字符集及排序规则》 中进行批量修改表字段的字符集及排序规则时,如果字段有被外键引用,则无法进行修改,会报错,如:

1832 - Cannot change column 'EXECUTION_ID_': used in a foreign key constrain ...

这种问题的解决的思路有两种。
一是

  1. 备份相关表的外键配置
  2. 删除外键关联
  3. 再修改
  4. 还原外键配置

上面的操作如果针对小范围的修改,可以手工进行备份和还原,如果存在多个表批量操作的话 手工操作就比较繁琐。

二是
在执行前先将外键检查关闭,执行修改sql后在 打开外键约束检查。

-- 关闭外键检查
SET FOREIGN_KEY_CHECKS = 0;
xxxxx

-- 打开外键检查
SET FOREIGN_KEY_CHECKS = 1;

上面的方法二已经可以解决文章开头说的问题了。如果方法一可以用于其他特殊场景,下面详细说下方法一的操作过程。

解决办法

下面提供了备份外键和删除外键的SQL。
主要是通过 mysql的information_schemaREFERENTIAL_CONSTRAINTSKEY_COLUMN_USAGE两张表进行实现。

注意:在执行删除前,一定要先备份

备份SQL

SELECT 
CONCAT('ALTER TABLE `',TABLE_SCHEMA,'`.`', TABLE_NAME, '` ADD CONSTRAINT `' ,CONSTRAINT_NAME, '` FOREIGN KEY (', COLUMN_NAMES, ') REFERENCES `', REFERENCED_TABLE_SCHEMA ,'`.`', REFERENCED_TABLE_NAME, '` (', REFERENCED_COLUMN_NAMES, ') ON DELETE ', DELETE_RULE, ' ON UPDATE ', UPDATE_RULE, ';' 
) AS 'fk_add_sql' 
FROM (
SELECT
  temp.CONSTRAINT_SCHEMA,
	temp.CONSTRAINT_NAME,
	temp.UPDATE_RULE,
	temp.DELETE_RULE,
	temp.TABLE_SCHEMA,
	temp.TABLE_NAME,
	temp.REFERENCED_TABLE_SCHEMA,
	temp.REFERENCED_TABLE_NAME,
	GROUP_CONCAT(CONCAT('`', temp.COLUMN_NAME, '`')) AS COLUMN_NAMES,
	GROUP_CONCAT(CONCAT('`',temp.REFERENCED_COLUMN_NAME , '`')) AS REFERENCED_COLUMN_NAMES
FROM
	(
	SELECT
		r1.CONSTRAINT_SCHEMA,
		r1.CONSTRAINT_NAME,
		r1.UPDATE_RULE,
		r1.DELETE_RULE,
		k1.TABLE_SCHEMA,
		r1.TABLE_NAME,
		k1.COLUMN_NAME,
		K1.REFERENCED_TABLE_SCHEMA,
		r1.REFERENCED_TABLE_NAME,
		k1.REFERENCED_COLUMN_NAME 
	FROM
		information_schema.REFERENTIAL_CONSTRAINTS r1
		LEFT JOIN information_schema.KEY_COLUMN_USAGE k1 ON k1.CONSTRAINT_NAME = r1.CONSTRAINT_NAME 
		AND k1.TABLE_NAME = r1.TABLE_NAME 
		AND k1.REFERENCED_TABLE_NAME = r1.REFERENCED_TABLE_NAME 
	WHERE
		k1.TABLE_SCHEMA = '你的数据库名' and r1.CONSTRAINT_SCHEMA='你的数据库名'
		AND k1.REFERENCED_TABLE_NAME IS NOT NULL AND k1.TABLE_NAME IS NOT NULL
	) temp 
GROUP BY
  temp.CONSTRAINT_SCHEMA,
	temp.CONSTRAINT_NAME,
	temp.UPDATE_RULE,
	temp.DELETE_RULE,
	temp.TABLE_SCHEMA,
	temp.TABLE_NAME,
	temp.REFERENCED_TABLE_SCHEMA,
	temp.REFERENCED_TABLE_NAME) temp2;

在这里插入图片描述

删除SQL

SELECT DISTINCT 
	CONCAT( 'ALTER TABLE `', TABLE_NAME, '` DROP FOREIGN KEY `', CONSTRAINT_NAME, '`;' ) AS 'fk_drop_sql' 
FROM
	information_schema.KEY_COLUMN_USAGE 
WHERE
	TABLE_SCHEMA = '你的数据库名' 
	AND REFERENCED_TABLE_NAME IS NOT NULL;

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IccBoY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值