给表加主键
alter table zy_onestop_db.表名 add primary key(字段名)
将第一个库的主键复制到第二个库
这里第一个表:zy_onestop_produce 第二个表 : zy_onestop_db
查询第一个库表主键
select TABLE_NAME,COLUMN_NAME from information_schema.`COLUMNS` where TABLE_SCHEMA = 'zy_onestop_produce' and COLUMN_KEY = 'PRI'
定义游标获取表名和字段名
-- 定义游标遍历变量
DECLARE s int DEFAULT 169;
DECLARE c_name varchar(255);
DECLARE c_id varchar(255);
-- 存储数据表创建语句
DECLARE sql1Str VARCHAR(500);
-- 定义游标,并将sql结果集赋值到游标中
DECLARE report CURSOR FOR select TABLE_NAME,COLUMN_NAME from information_schema.`COLUMNS` where TABLE_SCHEMA = 'zy_onestop_produce' and COLUMN_KEY = 'PRI'
在循环写业务
-- 声明当游标遍历完后将标志变量置成某个值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
-- 打开游标
open report;
-- 将游标中的值赋值给变量,注意:变量名不要和返回的列名同名,变量顺序要和sql结果列的顺序一致
fetch report into c_name,c_id;
while s<>1 do
end while;
-- 关闭游标
close report;
在循环体写上逻辑
SET @sql1Str= CONCAT('alter table zy_onestop_db.',c_name,' add primary key(',c_id,');');
prepare s1 from @sql1Str;
execute s1;
deallocate prepare s1;
-- 将游标中的值再赋值给变量,供下次循环使用
fetch report into c_name,c_id;
-- 当s等于1时表明遍历以完成,退出循环
set s = s-1;
最后执行
call primarykeys;
运行时报下面图片的错
这是由于第二个表上存在主键,就会报定义了多个主键
select * from information_schema.`COLUMNS` where TABLE_SCHEMA = 'zy_onestop_db' and COLUMN_KEY = 'PRI'
查询一下第二个表果然如此
把第二个表主键删除再call primarykeys; 不会报错了