mysql 批量删除索引外键

问题:数据库每个表中的索引和外键重复出现了两次,其中明显能看出一组外键名称是自动生成的,以FK开头,后面跟一串字母和数字,而我自定义的外键是FK_开头。

我用客户端删除了几个表的外键之后,发现这活不是人干的,表太多,某些表的外键也太多。

关于如何出现的重复外键和索引已经无从考证了,有遇到过的同志劳烦告知下。

解决过程:

1、我不想一个一个点开表,然后点开索引,然后在一个一个删除,能不能用命令删除呢?可以。

DROP INDEX FK1AB131DC ON 

2、可这也不方便,得知道具体的索引名称,还得一个一个复制到语句里执行。一计不成再生一计,网上查了下,使用sql能查到某个表的外键

SELECT DISTINCT index_name FROM information_schema.statistics WHERE table_name = tbname AND index_name like 'FK%'

这倒是可以查到,但是没法和Drop语句结合,继续查资料

3、终于发现了使用存储过程,可以解决。中间又遇到几个问题:

一是like无法定位到重复的外键,转而通过正则表达式实现(原来sql语句也支持正则表达式,好强大的正则);

二是在循环语句中无法用变量当做索引名,只能使用prepare方式执行;

三是prepare中的sql变量前面必须用@符合,并且不能通过declare声明;

四是给存储过程传递参数;

最终的sql如下所示:

DROP PROCEDURE IF EXISTS dropIndexAndFK;  
# 用双斜线代替";" 防止存储过程被截断
DELIMITER //
# 创建存储过程 dropIndexAndFK
CREATE PROCEDURE dropIndexAndFK(tbname VARCHAR(30))
	BEGIN
		#定义 变量
		DECLARE fk VARCHAR(30);
		#此变可有可无,为了给个该存储函数执行成功后给个提示,运行下便知道
		DECLARE str VARCHAR(300);
		#这个用于处理游标到达最后一行的情况
		DECLARE s INT DEFAULT 0;
		DECLARE sqlexec VARCHAR(100);
		DECLARE param VARCHAR(30);
		#声明游标cursor_name(cursor_name是个多行结果集)
		DECLARE cursor_name CURSOR FOR SELECT DISTINCT index_name FROM information_schema.statistics WHERE table_name = tbname AND index_name REGEXP param;

		#设置一个终止标记
		DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s=1;		
		#正则表达式
		SET param = 'FK[a-zA-Z0-9]';
 
		#打开游标
		OPEN cursor_name;
		#获取游标当前指针的记录,读取一行数据并传给变量fk
		FETCH  cursor_name INTO fk;
		#开始循环,判断是否游标已经到达了最后作为循环条件
		WHILE s <> 1 DO
			#select fk;
			# 删除外键
			SET @SQL = CONCAT('ALTER TABLE ',tbname,' DROP  FOREIGN KEY ', fk);
			SELECT @SQL;
			PREPARE stmt1 FROM @SQL;
			EXECUTE stmt1;
			DEALLOCATE PREPARE stmt1;
			
			# 删除索引
			SET @SQL = CONCAT('DROP INDEX ', fk, ' ON ',tbname);
			SELECT @SQL;
			PREPARE stmt2 FROM @SQL;
			EXECUTE stmt2;
			DEALLOCATE PREPARE stmt2;
			
			#读取下一行的数据
			FETCH cursor_name INTO fk;
		END WHILE;
		#关闭游标
		CLOSE cursor_name ;
	#语句执行结束
	END;
         
#调用存储函数dropIndexAndFK
CALL dropIndexAndFK('itsm_audit');


5、当然,还是不太方便,存储过程执行一次就可以了,但是调用也就是call的时候,每个表都要执行一次,要不要再循环下所有的表呢?算了,先不折腾了。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值