草稿整理后mysql两个数据库结构对比

目录
  • 1、草稿:
  • 2、整理:
  • 3、无注释
  • 总结

1、草稿:

-- 1.将mysql分隔符从;设置为&
delimiter &
-- 2.如果存在存储过程getdatabasecount则删除
drop procedure if exists `getdatabasecount` &
-- 3.定义存储过程,获取特定数据库的数量
-- (传入参数database_name字符串类型,为数据库名;传出参数count_date整数类型,为数量)
create definer=`root`@`localhost` procedure getdatabasecount(in database_name char(20), out count_date int)
begin
-- 4.声明变量
declare $sqltext varchar(1000);
-- 5.动态sql,把sql返回值放到@count_date中
set $sqltext = concat('select count(*) into @count_date from information_schema.columns t where t.`table_schema` = \'', database_name, '\';');
set @sqlcounts := $sqltext;
-- 6.预编释,stmt预编释变量的名称
prepare stmt from @sqlcounts;
-- 7.执行sql语句
execute stmt;
-- 8.释放资源
deallocate prepare stmt;
-- 9.获取动态sql语句返回值
set count_date = @count_date;
end
-- 10.定义存储过程结束
&
-- 2.如果存在存储过程getcount则删除
drop procedure if exists `gettablecount` &
-- 3.定义存储过程,获取特定数据库表的数量
-- (传入参数database_name字符串类型,为数据库名;传入参数table_name字符串类型,为表名;传出参数count_date整数类型,为数量)
create definer=`root`@`localhost` procedure gettablecount(in database_name char(20), in table_name char(200), out count_date int)
begin
-- 4.声明变量
declare $sqltext varchar(1000);
-- 5.动态sql,把sql返回值放到@count_date中
set $sqltext = concat('select count(*) into @count_date from information_schema.columns t where t.`table_schema` = \'', database_name, '\' and t.`table_name` = \'', table_name, '\';');
set @sqlcounts := $sqltext;
-- 6.预编释,stmt预编释变量的名称
prepare stmt from @sqlcounts;
-- 7.执行sql语句
execute stmt;
-- 8.释放资源
deallocate prepare stmt;
-- 9.获取动态sql语句返回值
set count_date = @count_date;
end
-- 10.定义存储过程结束
&
-- 2.如果存在存储过程getcolumncount则删除
drop procedure if exists `getcolumncount` &
-- 3.定义存储过程,获取特定数据库表列的数量
-- (传入参数database_name字符串类型,为数据库名;传入参数table_name字符串类型,为表名;传入参数column_name字符串类型,为列名;传出参数count_date整数类型,为数量)
create definer=`root`@`localhost` procedure getcolumncount(in database_name char(20), in table_name char(200), in column_name char(200), out count_date int)
begin
-- 4.声明变量
declare $sqltext varchar(1000);
-- 5.动态sql,把sql返回值放到@count_date中
set $sqltext = concat('select count(*) into @count_date from information_schema.columns t where t.`table_schema` = \'', database_name, '\' and t.`table_name` = \'', table_name, '\' and t.`column_name` = \'', column_name, '\';');
set @sqlcounts := $sqltext;
-- 6.预编释,stmt预编释变量的名称
prepare stmt from @sqlcounts;
-- 7.执行sql语句
execute stmt;
-- 8.释放资源
deallocate prepare stmt;
-- 9.获取动态sql语句返回值
set count_date = @count_date;
end
-- 10.定义存储过程结束
&
-- 2.如果存在存储过程getcolumninfo则删除
drop procedure if exists `getcolumninfo` &
-- 3.定义存储过程,获取特定数据库表列的信息
-- (传入参数database_name字符串类型,为数据库名;传入参数table_name字符串类型,为表名;传入参数column_name字符串类型,为列名;传入参数column_info字符串类型,列信息;传出参数result_data字符串类型,信息)
create definer=`root`@`localhost` procedure getcolumninfo(in database_name char(20), in table_name char(200), in column_name char(200), in column_info char(50), out result_data char(20))
begin
-- 4.声明变量
declare $sqltext varchar(1000);
-- 5.动态sql,把sql返回值放到@count_date中
set $sqltext = concat('select t.', column_info,' into @column_info from information_schema.columns t where t.`table_schema` = \'', database_name, '\' and t.`table_name` = \'', table_name, '\' and t.`column_name` = \'', column_name, '\';');
set @sqlcounts := $sqltext;
-- 6.预编释,stmt预编释变量的名称
prepare stmt from @sqlcounts;
-- 7.执行sql语句
execute stmt;
-- 8.释放资源
deallocate prepare stmt;
-- 9.获取动态sql语句返回值
set result_data = @column_info;
end
-- 10.定义存储过程结束
&
-- 11.如果存在存储过程comparison则删除
drop procedure if exists `comparison` &
-- 12.定义存储过程,获取指定数据库关键词的表列名
-- (传入参数database_n字符串类型,数据库名;传入参数collation_n字符串类型,具体编码类型;传入参数key_name字符串类型,为关键字;传出参数tablecolumnnames字符串类型,表列名)
create definer=`root`@`localhost` procedure comparison(in database_1 char(20), in database_2 char(20), in column_info char(50), out info text)
begin
-- 13.声明变量。database_name查询出来的数据库,table_name查询出来的表名,column_name查询出来的列名,collation_name查询出来的具体编码类型
declare database_name, table_name, column_name, collation_name, result_data_1, result_data_2 char(200);
declare this_info, database_table_no text default '';
declare database_count_1, database_count_2, resoult_count int default 0;
-- 14.定义游标结束标识,默认为0
declare stopflag int default 0;
-- 15.定义游标,其实就是临时存储sql返回的集合
declare sql_resoult cursor for select t.table_schema, t.table_name, t.column_name, t.collation_name from information_schema.columns t;
-- 16.游标结束就设置为1
declare continue handler for not found set stopflag=1;
call getdatabasecount(database_1, database_count_1);
call getdatabasecount(database_2, database_count_2);
if (database_count_1 <> 0 and database_count_2 <> 0) then
-- 17.打开游标
open sql_resoult;
-- 18.读取游标中数据,存储到指定变量
fetch sql_resoult into database_name, table_name, column_name, collation_name;
-- 19.没有结束继续往下走
while (stopflag=0) do
begin
-- 20.判断数据库是否为输入的数据库名称,和,指定具体编码类型,和,不含.
if (database_name=database_1 and instr(database_table_no, concat(database_2, '_', table_name)) = 0) then
-- 21.调用存储过程,获取特定表列关键词的数量
call gettablecount(database_2, table_name, resoult_count);
-- 22.如果数量不等于0,那么记录表列名
if (resoult_count <> 0) then
call getcolumncount(database_2, table_name, column_name, resoult_count);
-- 23.拼接字符串,不可直接用传出变量设值
if (resoult_count <> 0) then
call getcolumninfo(database_1, table_name, column_name, column_info, result_data_1);
call getcolumninfo(database_2, table_name, column_name, column_info, result_data_2);
-- 23.拼接字符串,不可直接用传出变量设值
if (result_data_1 <> result_data_2) then
if (this_info is null or this_info='') then
set this_info=concat(table_name, '表的', column_name, '列的', column_info, '不一样;\n');
else
set this_info=concat(this_info, table_name, '表的', column_name, '列的', column_info, '不一样;\n');
end if;
end if;
else
if (this_info is null or this_info='') then
set this_info=concat(database_2, '的', table_name, '表的', column_name, '列不存在;\n');
else
set this_info=concat(this_info, database_2, '的', table_name, '表的', column_name, '列不存在;\n');
end if;
end if;
else
if (this_info is null or this_info='') then
set this_info=concat(database_2, '的', table_name, '表不存在;\n');
else
set this_info=concat(this_info, database_2, '的', table_name, '表不存在;\n');
end if;
set database_table_no=concat(database_table_no, ';', database_2, '_', table_name, ';');
end if;
else
if (database_name=database_2 and instr(database_table_no, concat(database_1, '_', table_name)) = 0) then
call gettablecount(database_1, table_name, resoult_count);
if (resoult_count <> 0) then
call getcolumncount(database_1, table_name, column_name, resoult_count);
if (resoult_count = 0) then
if (this_info is null or this_info='') then
set this_info=concat(database_1, '的', table_name, '表的', column_name, '列不存在;\n');
else
set this_info=concat(this_info, database_1, '的', table_name, '表的', column_name, '列不存在;\n');
end if;
end if;
else
if (this_info is null or this_info='') then
set this_info=concat(database_1, '的', table_name, '表不存在;\n');
else
set this_info=concat(this_info, database_1, '的', table_name, '表不存在;\n');
end if;
set database_table_no=concat(database_table_no, ';', database_1, '_', table_name, ';');
end if;
end if;
end if;
-- 24.读取游标中数据,存储到指定变量。(和18一样)
fetch sql_resoult into database_name, table_name, column_name, collation_name;
end;
end while;
-- 25.关闭游标
close sql_resoult;
else
if (database_count_1 = 0 and database_count_2 = 0) then
set this_info = concat(database_1, '和', database_2, '数据库不存在或为空数据库');
else
if (database_count_1 = 0) then
set this_info = concat(database_1, '数据库不存在或为空数据库');
else
set this_info = concat(database_2, '数据库不存在或为空数据库');
end if;
end if;
end if;
-- 26.把数据放到传出参数
set info=this_info;
end
-- 27.定义存储过程结束
&
-- 28.将mysql分隔符从&设置为;
delimiter ;
-- 29.设置变量
set @database_1='my_test';
set @database_2='my_test2';
set @column_info='data_type';
set @count='';
-- 30.调用存储过程
call comparison(@database_1, @database_2, @column_info, @count);
-- 31.打印
select @count;
-- 32.如果存在存储过程则删除
drop procedure if exists `comparison`;

2、整理:

-- 1.将mysql分隔符从;设置为&
delimiter &
-- 2.如果存在存储过程getdatabasecount则删除
drop procedure if exists `getdatabasecount` &
-- 3.定义存储过程,获取特定数据库的数量
-- (传入参数database_name字符串类型,为数据库名;传出参数count_date整数类型,为数量)
create definer=`root`@`localhost` procedure getdatabasecount(in database_name char(20), out count_date int)
begin
-- 4.声明变量
declare $sqltext varchar(1000);
-- 5.动态sql,把sql返回值放到@count_date中
set $sqltext = concat('select count(*) into @count_date from information_schema.columns t where t.`table_schema` = \'', database_name, '\';');
set @sqlcounts := $sqltext;
-- 6.预编释,stmt预编释变量的名称
prepare stmt from @sqlcounts;
-- 7.执行sql语句
execute stmt;
-- 8.释放资源
deallocate prepare stmt;
-- 9.获取动态sql语句返回值
set count_date = @count_date;
end
-- 10.定义存储过程结束
&
-- 11.如果存在存储过程gettablecount则删除
drop procedure if exists `gettablecount` &
-- 12.定义存储过程,获取特定数据库表的数量
-- (传入参数database_name字符串类型,为数据库名;传入参数table_name字符串类型,为表名;传出参数count_date整数类型,为数量)
create definer=`root`@`localhost` procedure gettablecount(in database_name char(20), in table_name char(200), out count_date int)
begin
-- 13.声明变量
declare $sqltext varchar(1000);
-- 14.动态sql,把sql返回值放到@count_date中
set $sqltext = concat('select count(*) into @count_date from information_schema.columns t where t.`table_schema` = \'', database_name, '\' and t.`table_name` = \'', table_name, '\';');
set @sqlcounts := $sqltext;
-- 15.预编释,stmt预编释变量的名称
prepare stmt from @sqlcounts;
-- 16.执行sql语句
execute stmt;
-- 17.释放资源
deallocate prepare stmt;
-- 18.获取动态sql语句返回值
set count_date = @count_date;
end
-- 19.定义存储过程结束
&
-- 20.如果存在存储过程getcolumncount则删除
drop procedure if exists `getcolumncount` &
-- 21.定义存储过程,获取特定数据库表列的数量
-- (传入参数database_name字符串类型,为数据库名;传入参数table_name字符串类型,为表名;传入参数column_name字符串类型,为列名;传出参数count_date整数类型,为数量)
create definer=`root`@`localhost` procedure getcolumncount(in database_name char(20), in table_name char(200), in column_name char(200), out count_date int)
begin
-- 22.声明变量
declare $sqltext varchar(1000);
-- 23.动态sql,把sql返回值放到@count_date中
set $sqltext = concat('select count(*) into @count_date from information_schema.columns t where t.`table_schema` = \'', database_name, '\' and t.`table_name` = \'', table_name, '\' and t.`column_name` = \'', column_name, '\';');
set @sqlcounts := $sqltext;
-- 24.预编释,stmt预编释变量的名称
prepare stmt from @sqlcounts;
-- 25.执行sql语句
execute stmt;
-- 26.释放资源
deallocate prepare stmt;
-- 27.获取动态sql语句返回值
set count_date = @count_date;
end
-- 28.定义存储过程结束
&
-- 29.如果存在存储过程getcolumninfo则删除
drop procedure if exists `getcolumninfo` &
-- 30.定义存储过程,获取特定数据库表列的信息
-- (传入参数database_name字符串类型,为数据库名;传入参数table_name字符串类型,为表名;传入参数column_name字符串类型,为列名;传入参数column_info字符串类型,列信息;传出参数result_data字符串类型,信息)
create definer=`root`@`localhost` procedure getcolumninfo(in database_name char(20), in table_name char(200), in column_name char(200), in column_info char(50), out result_data char(20))
begin
-- 31.声明变量
declare $sqltext varchar(1000);
-- 32.动态sql,把sql返回值放到@count_date中
set $sqltext = concat('select t.', column_info,' into @column_info from information_schema.columns t where t.`table_schema` = \'', database_name, '\' and t.`table_name` = \'', table_name, '\' and t.`column_name` = \'', column_name, '\';');
set @sqlcounts := $sqltext;
-- 33.预编释,stmt预编释变量的名称
prepare stmt from @sqlcounts;
-- 34.执行sql语句
execute stmt;
-- 35.释放资源
deallocate prepare stmt;
-- 36.获取动态sql语句返回值
set result_data = @column_info;
end
-- 37.定义存储过程结束
&
-- 38.如果存在存储过程comparisontableexist则删除
drop procedure if exists `comparisontableexist` &
-- 39.定义存储过程,对比表是否存在
-- (传入参数database_1字符串类型,数据库名1;传入参数database_2字符串类型,数据库名2;传入参数info字符串类型,库表信息)
create definer=`root`@`localhost` procedure comparisontableexist(in database_1 char(20), in database_2 char(20), out info mediumtext)
begin
-- 40.声明变量。database_name查询出来的数据库,table_name查询出来的表名
declare database_name, table_name char(200);
-- this_info表不存在的记录,database_table_no表不存在的记录跳过重复查询
declare this_info, database_table_no mediumtext default '';
-- database_count_1统计数据库1存在的数量,database_count_2统计数据库2存在的数量,resoult_count统计表存在的数量。如果为0表示不存在
declare database_count_1, database_count_2, resoult_count int default 0;
-- 41.定义游标结束标识,默认为0
declare stopflag int default 0;
-- 42.定义游标,其实就是临时存储sql返回的集合
declare sql_resoult cursor for select t.table_schema, t.table_name from information_schema.columns t;
-- 43.游标结束就设置为1
declare continue handler for not found set stopflag=1;
-- 44.调用存储过程getdatabasecount,查看两个数据库是否存在,都存在则继续
call getdatabasecount(database_1, database_count_1);
call getdatabasecount(database_2, database_count_2);
if (database_count_1 <> 0 and database_count_2 <> 0) then
-- 45.打开游标
open sql_resoult;
-- 46.读取游标中数据,存储到指定变量
fetch sql_resoult into database_name, table_name;
-- 47.没有结束继续往下走
while (stopflag=0) do
begin
-- 48.判断数据库是否为输入的数据库名称1,去除已经比较过数据库2的表不存在
if (database_name=database_1 and instr(database_table_no, concat(database_2, '_', table_name)) = 0) then
-- 49.调用存储过程gettablecount,查看表是否存在
call gettablecount(database_2, table_name, resoult_count);
-- 50.如果数量等于0,那么表不存在
if (resoult_count = 0) then
-- 51.把不存在的表记录下来
if (this_info is null or this_info='') then
set this_info=concat(database_2, '的', table_name, '表不存在;\n');
else
set this_info=concat(this_info, database_2, '的', table_name, '表不存在;\n');
end if;
set database_table_no=concat(database_table_no, ';', database_2, '_', table_name, ';');
end if;
else
-- 52.判断数据库是否为输入的数据库名称2,去除已经比较过数据库1的表不存在
if (database_name=database_2 and instr(database_table_no, concat(database_1, '_', table_name)) = 0) then
call gettablecount(database_1, table_name, resoult_count);
if (resoult_count = 0) then
if (this_info is null or this_info='') then
set this_info=concat(database_1, '的', table_name, '表不存在;\n');
else
set this_info=concat(this_info, database_1, '的', table_name, '表不存在;\n');
end if;
set database_table_no=concat(database_table_no, ';', database_1, '_', table_name, ';');
end if;
end if;
end if;
-- 53.读取游标中数据,存储到指定变量。(和46一样)
fetch sql_resoult into database_name, table_name;
end;
end while;
-- 54.关闭游标
close sql_resoult;
else
if (database_count_1 = 0 and database_count_2 = 0) then
set this_info = concat(database_1, '和', database_2, '数据库不存在或为空数据库');
else
if (database_count_1 = 0) then
set this_info = concat(database_1, '数据库不存在或为空数据库');
else
set this_info = concat(database_2, '数据库不存在或为空数据库');
end if;
end if;
end if;
-- 55.把数据放到传出参数
set info=this_info;
end
-- 56.定义存储过程结束
&
-- 57.如果存在存储过程comparisoncolumnexist则删除
drop procedure if exists `comparisoncolumnexist` &
-- 58.定义存储过程,对比列是否存在
-- (传入参数database_1字符串类型,数据库名1;传入参数database_2字符串类型,数据库名2;传入参数info字符串类型,库表信息)
create definer=`root`@`localhost` procedure comparisoncolumnexist(in database_1 char(20), in database_2 char(20), out info mediumtext)
begin
-- 59.声明变量。database_name查询出来的数据库,table_name查询出来的表名,column_name查询出来的列名
declare database_name, table_name, column_name char(200);
-- this_info表不存在的记录,database_table_no表不存在的记录跳过重复查询
declare this_info, database_table_no text default '';
-- database_count_1统计数据库1存在的数量,database_count_2统计数据库2存在的数量,resoult_count统计表存在的数量。如果为0表示不存在
declare database_count_1, database_count_2, resoult_count int default 0;
-- 60.定义游标结束标识,默认为0
declare stopflag int default 0;
-- 61.定义游标,其实就是临时存储sql返回的集合
declare sql_resoult cursor for select t.table_schema, t.table_name, t.column_name from information_schema.columns t;
-- 62.游标结束就设置为1
declare continue handler for not found set stopflag=1;
-- 63.调用存储过程getdatabasecount,查看两个数据库是否存在,都存在则继续(同44)
call getdatabasecount(database_1, database_count_1);
call getdatabasecount(database_2, database_count_2);
if (database_count_1 <> 0 and database_count_2 <> 0) then
-- 64.打开游标
open sql_resoult;
-- 65.读取游标中数据,存储到指定变量
fetch sql_resoult into database_name, table_name, column_name;
-- 66.没有结束继续往下走
while (stopflag=0) do
begin
-- 67.判断数据库是否为输入的数据库名称1,去除已经比较过数据库2的表不存在(同48)
if (database_name=database_1 and instr(database_table_no, concat(database_2, '_', table_name)) = 0) then
-- 68.调用存储过程gettablecount,查看表是否存在(同49)
call gettablecount(database_2, table_name, resoult_count);
-- 69.如果数量不等于0,则继续
if (resoult_count <> 0) then
-- 70.调用存储过程getcolumncount,查看列是否存在。为0说明不存在
call getcolumncount(database_2, table_name, column_name, resoult_count);
if (resoult_count = 0) then
if (this_info is null or this_info='') then
set this_info=concat(database_2, '的', table_name, '表的', column_name, '列不存在;\n');
else
set this_info=concat(this_info, database_2, '的', table_name, '表的', column_name, '列不存在;\n');
end if;
end if;
else
set database_table_no=concat(database_table_no, ';', database_2, '_', table_name, ';');
end if;
else
-- 71.判断数据库是否为输入的数据库名称2,去除已经比较过数据库1的表不存在(同52)
if (database_name=database_2 and instr(database_table_no, concat(database_1, '_', table_name)) = 0) then
call gettablecount(database_1, table_name, resoult_count);
if (resoult_count <> 0) then
call getcolumncount(database_1, table_name, column_name, resoult_count);
if (resoult_count = 0) then
if (this_info is null or this_info='') then
set this_info=concat(database_1, '的', table_name, '表的', column_name, '列不存在;\n');
else
set this_info=concat(this_info, database_1, '的', table_name, '表的', column_name, '列不存在;\n');
end if;
end if;
else
set database_table_no=concat(database_table_no, ';', database_1, '_', table_name, ';');
end if;
end if;
end if;
-- 72.读取游标中数据,存储到指定变量。(和65一样)
fetch sql_resoult into database_name, table_name, column_name;
end;
end while;
-- 73.关闭游标
close sql_resoult;
end if;
-- 74.把数据放到传出参数
set info=this_info;
end
-- 75.定义存储过程结束
&
-- 76.如果存在存储过程comparisoncolumninfo则删除
drop procedure if exists `comparisoncolumninfo` &
-- 77.定义存储过程,对比列的不同
-- (传入参数database_1字符串类型,数据库名1;传入参数database_2字符串类型,数据库名2;传入参数info字符串类型,库表信息)
create definer=`root`@`localhost` procedure comparisoncolumninfo(in database_1 char(20), in database_2 char(20),out info mediumtext)
begin
-- 78.声明变量。database_name查询出来的数据库,table_name查询出来的表名,column_name查询出来的列名,collation_name查询出来的具体编码类型
-- result_data_1数据库1的列信息,result_data_2数据库2的列信息,column_info对比的列(现在只比较data_type、character_set_name)
declare database_name, table_name, column_name, collation_name, result_data_1, result_data_2, column_info char(200);
-- this_info表不存在的记录,database_table_no表不存在的记录跳过重复查询
declare this_info, database_table_no mediumtext default '';
-- database_count_1统计数据库1存在的数量,database_count_2统计数据库2存在的数量,resoult_count统计表存在的数量。如果为0表示不存在
declare database_count_1, database_count_2, resoult_count int default 0;
-- 79.定义游标结束标识,默认为0
declare stopflag int default 0;
-- 80.定义游标,其实就是临时存储sql返回的集合
declare sql_resoult cursor for select t.table_schema, t.table_name, t.column_name, t.collation_name from information_schema.columns t;
-- 81.游标结束就设置为1
declare continue handler for not found set stopflag=1;
-- 82.调用存储过程getdatabasecount,查看两个数据库是否存在,都存在则继续(同63)
call getdatabasecount(database_1, database_count_1);
call getdatabasecount(database_2, database_count_2);
if (database_count_1 <> 0 and database_count_2 <> 0) then
-- 83.打开游标
open sql_resoult;
-- 84.读取游标中数据,存储到指定变量
fetch sql_resoult into database_name, table_name, column_name, collation_name;
-- 85.没有结束继续往下走
while (stopflag=0) do
begin
-- 86.判断数据库是否为输入的数据库名称1,去除已经比较过数据库2的表不存在(同67)
if (database_name=database_1 and instr(database_table_no, concat(database_2, '_', table_name)) = 0) then
-- 87.调用存储过程gettablecount,查看表是否存在(同68)
call gettablecount(database_2, table_name, resoult_count);
-- 88.如果数量不等于0,则继续
if (resoult_count <> 0) then
-- 89.调用存储过程getcolumncount,查看列是否存在。为0说明不存在(同70)
call getcolumncount(database_2, table_name, column_name, resoult_count);
if (resoult_count <> 0) then
-- 90.对比data_type是否相同
set column_info = 'data_type';
call getcolumninfo(database_1, table_name, column_name, column_info, result_data_1);
call getcolumninfo(database_2, table_name, column_name, column_info, result_data_2);
if (result_data_1 <> result_data_2) then
if (this_info is null or this_info='') then
set this_info=concat(table_name, '表的', column_name, '列的', column_info, '不一样;\n');
else
set this_info=concat(this_info, table_name, '表的', column_name, '列的', column_info, '不一样;\n');
end if;
end if;
-- 91.对比character_set_name是否相同
set column_info = 'character_set_name';
call getcolumninfo(database_1, table_name, column_name, column_info, result_data_1);
call getcolumninfo(database_2, table_name, column_name, column_info, result_data_2);
if (result_data_1 <> result_data_2) then
if (this_info is null or this_info='') then
set this_info=concat(table_name, '表的', column_name, '列的', column_info, '不一样;\n');
else
set this_info=concat(this_info, table_name, '表的', column_name, '列的', column_info, '不一样;\n');
end if;
end if;
end if;
else
set database_table_no=concat(database_table_no, ';', database_2, '_', table_name, ';');
end if;
else
if (database_name=database_2 and instr(database_table_no, concat(database_1, '_', table_name)) = 0) then
call gettablecount(database_1, table_name, resoult_count);
if (resoult_count = 0) then
set database_table_no=concat(database_table_no, ';', database_1, '_', table_name, ';');
end if;
end if;
end if;
-- 92.读取游标中数据,存储到指定变量。(和84一样)
fetch sql_resoult into database_name, table_name, column_name, collation_name;
end;
end while;
-- 93.关闭游标
close sql_resoult;
end if;
-- 94.把数据放到传出参数
set info=this_info;
end
-- 95.定义存储过程结束
&
-- 96.将mysql分隔符从&设置为;
delimiter ;
-- 97.设置变量
set @database_1='my_test1';
set @database_2='my_test2';
set @tableexistinfo='';
set @columnexistinfo='';
set @columninfo='';
-- 98.调用存储过程
call comparisontableexist(@database_1, @database_2, @tableexistinfo);
call comparisoncolumnexist(@database_1, @database_2, @columnexistinfo);
call comparisoncolumninfo(@database_1, @database_2, @columninfo);
set @info=concat(@tableexistinfo, '\n', @columnexistinfo, '\n', @columninfo);
-- 99.打印
select @info;
-- 100.如果存在存储过程则删除
drop procedure if exists `comparisoncolumninfo`;
drop procedure if exists `comparisoncolumnexist`;
drop procedure if exists `comparisontableexist`;
drop procedure if exists `getcolumninfo`;
drop procedure if exists `getcolumncount`;
drop procedure if exists `gettablecount`;
drop procedure if exists `getdatabasecount`;

3、无注释

delimiter &
drop procedure if exists `getdatabasecount` &
create definer=`root`@`localhost` procedure getdatabasecount(in database_name char(20), out count_date int)
begin
declare $sqltext varchar(1000);
set $sqltext = concat('select count(*) into @count_date from information_schema.columns t where t.`table_schema` = \'', database_name, '\';');
set @sqlcounts := $sqltext;
prepare stmt from @sqlcounts;
execute stmt;
deallocate prepare stmt;
set count_date = @count_date;
end
&
drop procedure if exists `gettablecount` &
create definer=`root`@`localhost` procedure gettablecount(in database_name char(20), in table_name char(200), out count_date int)
begin
declare $sqltext varchar(1000);
set $sqltext = concat('select count(*) into @count_date from information_schema.columns t where t.`table_schema` = \'', database_name, '\' and t.`table_name` = \'', table_name, '\';');
set @sqlcounts := $sqltext;
prepare stmt from @sqlcounts;
execute stmt;
deallocate prepare stmt;
set count_date = @count_date;
end
&
drop procedure if exists `getcolumncount` &
create definer=`root`@`localhost` procedure getcolumncount(in database_name char(20), in table_name char(200), in column_name char(200), out count_date int)
begin
declare $sqltext varchar(1000);
set $sqltext = concat('select count(*) into @count_date from information_schema.columns t where t.`table_schema` = \'', database_name, '\' and t.`table_name` = \'', table_name, '\' and t.`column_name` = \'', column_name, '\';');
set @sqlcounts := $sqltext;
prepare stmt from @sqlcounts;
execute stmt;
deallocate prepare stmt;
set count_date = @count_date;
end
&
drop procedure if exists `getcolumninfo` &
create definer=`root`@`localhost` procedure getcolumninfo(in database_name char(20), in table_name char(200), in column_name char(200), in column_info char(50), out result_data char(20))
begin
declare $sqltext varchar(1000);
set $sqltext = concat('select t.', column_info,' into @column_info from information_schema.columns t where t.`table_schema` = \'', database_name, '\' and t.`table_name` = \'', table_name, '\' and t.`column_name` = \'', column_name, '\';');
set @sqlcounts := $sqltext;
prepare stmt from @sqlcounts;
execute stmt;
deallocate prepare stmt;
set result_data = @column_info;
end
&
drop procedure if exists `comparisontableexist` &
create definer=`root`@`localhost` procedure comparisontableexist(in database_1 char(20), in database_2 char(20), out info mediumtext)
begin
declare database_name, table_name char(200);
declare this_info, database_table_no mediumtext default '';
declare database_count_1, database_count_2, resoult_count int default 0;
declare stopflag int default 0;
declare sql_resoult cursor for select t.table_schema, t.table_name from information_schema.columns t;
declare continue handler for not found set stopflag=1;
call getdatabasecount(database_1, database_count_1);
call getdatabasecount(database_2, database_count_2);
if (database_count_1 <> 0 and database_count_2 <> 0) then
open sql_resoult;
fetch sql_resoult into database_name, table_name;
while (stopflag=0) do
begin
if (database_name=database_1 and instr(database_table_no, concat(database_2, '_', table_name)) = 0) then
call gettablecount(database_2, table_name, resoult_count);
if (resoult_count = 0) then
if (this_info is null or this_info='') then
set this_info=concat(database_2, '的', table_name, '表不存在;\n');
else
set this_info=concat(this_info, database_2, '的', table_name, '表不存在;\n');
end if;
set database_table_no=concat(database_table_no, ';', database_2, '_', table_name, ';');
end if;
else
if (database_name=database_2 and instr(database_table_no, concat(database_1, '_', table_name)) = 0) then
call gettablecount(database_1, table_name, resoult_count);
if (resoult_count = 0) then
if (this_info is null or this_info='') then
set this_info=concat(database_1, '的', table_name, '表不存在;\n');
else
set this_info=concat(this_info, database_1, '的', table_name, '表不存在;\n');
end if;
set database_table_no=concat(database_table_no, ';', database_1, '_', table_name, ';');
end if;
end if;
end if;
fetch sql_resoult into database_name, table_name;
end;
end while;
close sql_resoult;
else
if (database_count_1 = 0 and database_count_2 = 0) then
set this_info = concat(database_1, '和', database_2, '数据库不存在或为空数据库');
else
if (database_count_1 = 0) then
set this_info = concat(database_1, '数据库不存在或为空数据库');
else
set this_info = concat(database_2, '数据库不存在或为空数据库');
end if;
end if;
end if;
set info=this_info;
end
&
drop procedure if exists `comparisoncolumnexist` &
create definer=`root`@`localhost` procedure comparisoncolumnexist(in database_1 char(20), in database_2 char(20), out info mediumtext)
begin
declare database_name, table_name, column_name char(200);
declare this_info, database_table_no text default '';
declare database_count_1, database_count_2, resoult_count int default 0;
declare stopflag int default 0;
declare sql_resoult cursor for select t.table_schema, t.table_name, t.column_name from information_schema.columns t;
declare continue handler for not found set stopflag=1;
call getdatabasecount(database_1, database_count_1);
call getdatabasecount(database_2, database_count_2);
if (database_count_1 <> 0 and database_count_2 <> 0) then
open sql_resoult;
fetch sql_resoult into database_name, table_name, column_name;
while (stopflag=0) do
begin
if (database_name=database_1 and instr(database_table_no, concat(database_2, '_', table_name)) = 0) then
call gettablecount(database_2, table_name, resoult_count);
if (resoult_count <> 0) then
call getcolumncount(database_2, table_name, column_name, resoult_count);
if (resoult_count = 0) then
if (this_info is null or this_info='') then
set this_info=concat(database_2, '的', table_name, '表的', column_name, '列不存在;\n');
else
set this_info=concat(this_info, database_2, '的', table_name, '表的', column_name, '列不存在;\n');
end if;
end if;
else
set database_table_no=concat(database_table_no, ';', database_2, '_', table_name, ';');
end if;
else
if (database_name=database_2 and instr(database_table_no, concat(database_1, '_', table_name)) = 0) then
call gettablecount(database_1, table_name, resoult_count);
if (resoult_count <> 0) then
call getcolumncount(database_1, table_name, column_name, resoult_count);
if (resoult_count = 0) then
if (this_info is null or this_info='') then
set this_info=concat(database_1, '的', table_name, '表的', column_name, '列不存在;\n');
else
set this_info=concat(this_info, database_1, '的', table_name, '表的', column_name, '列不存在;\n');
end if;
end if;
else
set database_table_no=concat(database_table_no, ';', database_1, '_', table_name, ';');
end if;
end if;
end if;
fetch sql_resoult into database_name, table_name, column_name;
end;
end while;
close sql_resoult;
end if;
set info=this_info;
end
&
drop procedure if exists `comparisoncolumninfo` &
create definer=`root`@`localhost` procedure comparisoncolumninfo(in database_1 char(20), in database_2 char(20),out info mediumtext)
begin
declare database_name, table_name, column_name, collation_name, result_data_1, result_data_2, column_info char(200);
declare this_info, database_table_no mediumtext default '';
declare database_count_1, database_count_2, resoult_count int default 0;
declare stopflag int default 0;
declare sql_resoult cursor for select t.table_schema, t.table_name, t.column_name, t.collation_name from information_schema.columns t;
declare continue handler for not found set stopflag=1;
call getdatabasecount(database_1, database_count_1);
call getdatabasecount(database_2, database_count_2);
if (database_count_1 <> 0 and database_count_2 <> 0) then
open sql_resoult;
fetch sql_resoult into database_name, table_name, column_name, collation_name;
while (stopflag=0) do
begin
if (database_name=database_1 and instr(database_table_no, concat(database_2, '_', table_name)) = 0) then
call gettablecount(database_2, table_name, resoult_count);
if (resoult_count <> 0) then
call getcolumncount(database_2, table_name, column_name, resoult_count);
if (resoult_count <> 0) then
set column_info = 'data_type';
call getcolumninfo(database_1, table_name, column_name, column_info, result_data_1);
call getcolumninfo(database_2, table_name, column_name, column_info, result_data_2);
if (result_data_1 <> result_data_2) then
if (this_info is null or this_info='') then
set this_info=concat(table_name, '表的', column_name, '列的', column_info, '不一样;\n');
else
set this_info=concat(this_info, table_name, '表的', column_name, '列的', column_info, '不一样;\n');
end if;
end if;
set column_info = 'character_set_name';
call getcolumninfo(database_1, table_name, column_name, column_info, result_data_1);
call getcolumninfo(database_2, table_name, column_name, column_info, result_data_2);
if (result_data_1 <> result_data_2) then
if (this_info is null or this_info='') then
set this_info=concat(table_name, '表的', column_name, '列的', column_info, '不一样;\n');
else
set this_info=concat(this_info, table_name, '表的', column_name, '列的', column_info, '不一样;\n');
end if;
end if;
end if;
else
set database_table_no=concat(database_table_no, ';', database_2, '_', table_name, ';');
end if;
else
if (database_name=database_2 and instr(database_table_no, concat(database_1, '_', table_name)) = 0) then
call gettablecount(database_1, table_name, resoult_count);
if (resoult_count = 0) then
set database_table_no=concat(database_table_no, ';', database_1, '_', table_name, ';');
end if;
end if;
end if;
fetch sql_resoult into database_name, table_name, column_name, collation_name;
end;
end while;
close sql_resoult;
end if;
set info=this_info;
end
&
delimiter ;
set @database_1='my_test3';
set @database_2='my_test4';
set @tableexistinfo='';
set @columnexistinfo='';
set @columninfo='';
call comparisontableexist(@database_1, @database_2, @tableexistinfo);
call comparisoncolumnexist(@database_1, @database_2, @columnexistinfo);
call comparisoncolumninfo(@database_1, @database_2, @columninfo);
set @info=concat(@tableexistinfo, '\n', @columnexistinfo, '\n', @columninfo);
select @info;
drop procedure if exists `comparisoncolumninfo`;
drop procedure if exists `comparisoncolumnexist`;
drop procedure if exists `comparisontableexist`;
drop procedure if exists `getcolumninfo`;
drop procedure if exists `getcolumncount`;
drop procedure if exists `gettablecount`;
drop procedure if exists `getdatabasecount`;

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注www.887551.com的更多内容!  

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐