mysql存储过程解决无主键数据导入【省大数据链路报送:自动生成uuid】

思路:

  1. 在导入数据之前,遍历某数据库下的所有表,取消表的主键约束和非空约束
  2. 导入数据之后,遍历某数据库下的所有表,对id值为null或空字符串的数据进行主键值更新操作
  3. 处理完所有数据之后,恢复主键和非空约束

根据思路分三个存储过程

1. 取消主键和非空约束
CREATE DEFINER = `root`@`%` PROCEDURE `NewProc`()
BEGIN
	# 数据导入后,添加id的主键约束和非空约束
	-- 循环标识
	declare i int default 0;
	-- 表名称
	declare tablename varchar(255);
	-- 声明游标
	declare result cursor for select table_name from information_schema.tables where table_schema='数据库名字';
	-- 当下一条没数据时 i
	declare continue handler for not found set i = 1;
	-- 打开游标
	open result; 
	-- 遍历数据表
	while i <> 1 do
			-- 逐个取出当前记录字段的值
			fetch result into tablename;

			-- 判断是否有主键
			set @judgePrimaryKeySql = concat("select count(*) into @num from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where table_name = '",tablename,"';");
						prepare judgePrimaryKeySql from @judgePrimaryKeySql;
						execute judgePrimaryKeySql;
						deallocate prepare judgePrimaryKeySql;
			
			if(@num = 0) then 
				-- 	取消主键和非空约束
				set @addConstraint1 = concat("alter table ",tablename," add primary key(id);");
							prepare addConstraint1 from @addConstraint1;
							execute addConstraint1;
							deallocate prepare addConstraint1;

				set @addConstraint2 = concat("alter table ",tablename," change column id id varchar(50) not null;");
							prepare addConstraint2 from @addConstraint2;
							execute addConstraint2;
							deallocate prepare addConstraint2;	
			end if;		
	end while;
	-- 关闭游标
	close result;

END;
2. 设置主键(这里用的uuid())
CREATE DEFINER = `root`@`%` PROCEDURE `NewProc`()
BEGIN
	# 设置id为uuid()
	-- 循环标识
	declare i int default 0;
	-- 表名称
	declare tablename varchar(255);
	-- 声明游标
	declare result cursor for select table_name from information_schema.tables where table_schema='数据库名字';
	-- 当下一条没数据时 i
	declare continue handler for not found set i = 1;
	-- 打开游标
	open result; 
	-- 遍历数据表
	while i <> 1 do
			-- 逐个取出当前记录字段的值
			fetch result into tablename;

			-- 设置主键
			set @setuuid = concat("update ",tablename," set id=replace(uuid(),'-','') where (id is null or id='');");
						prepare setuuid from @setuuid;
						execute setuuid;
						deallocate prepare setuuid;			
	
	end while;
	-- 关闭游标
	close result;	
	
END;

3. 添加主键和非空约束
CREATE DEFINER = `root`@`%` PROCEDURE `NewProc`()
BEGIN
	# 数据导入后,添加id的主键约束和非空约束
	-- 循环标识
	declare i int default 0;
	-- 表名称
	declare tablename varchar(255);
	-- 声明游标
	declare result cursor for select table_name from information_schema.tables where table_schema='zjedu_sz_datacenter';
	-- 当下一条没数据时 i
	declare continue handler for not found set i = 1;
	-- 打开游标
	open result; 
	-- 遍历数据表
	while i <> 1 do
			-- 逐个取出当前记录字段的值
			fetch result into tablename;

			-- 判断是否有主键
			set @judgePrimaryKeySql = concat("select count(*) into @num from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where table_name = '",tablename,"';");
						prepare judgePrimaryKeySql from @judgePrimaryKeySql;
						execute judgePrimaryKeySql;
						deallocate prepare judgePrimaryKeySql;
			
			if(@num = 0) then 
				-- 	添加主键和非空约束
				set @addConstraint1 = concat("alter table ",tablename," add primary key(id);");
							prepare addConstraint1 from @addConstraint1;
							execute addConstraint1;
							deallocate prepare addConstraint1;

				set @addConstraint2 = concat("alter table ",tablename," change column id id varchar(50) not null;");
							prepare addConstraint2 from @addConstraint2;
							execute addConstraint2;
							deallocate prepare addConstraint2;
				
			end if;
			
	end while;
	-- 关闭游标
	close result;
	
END;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

沐木金

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

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

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

打赏作者

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

抵扣说明:

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

余额充值