【草稿整理ing】【mysql】两个数据库结构对比

  1 -- 1.将mysql分隔符从;设置为&
  2 DELIMITER &
  3
  4 -- 2.如果存在存储过程getdatabaseCount则删除
  5 DROP PROCEDURE IF EXISTS `getdatabaseCount` &
  6 -- 3.定义存储过程,获取特定数据库的数量
  7 -- (传入参数database_name字符串类型,为数据库名;传出参数count_date整数类型,为数量)
  8 CREATE DEFINER=`root`@`localhost` PROCEDURE getdatabaseCount(IN database_name CHAR(20), OUT count_date INT)
  9     BEGIN
 10     -- 4.声明变量
 11     DECLARE $sqltext VARCHAR(1000);
 12     -- 5.动态sql,把sql返回值放到@count_date中
 13     SET $sqltext = CONCAT(‘SELECT COUNT(*) into @count_date FROM information_schema.COLUMNS t where t.`TABLE_SCHEMA` = \‘‘, database_name, ‘\‘;‘);
 14     SET @sqlcounts := $sqltext;
 15     -- 6.预编释,stmt预编释变量的名称
 16     PREPARE stmt FROM @sqlcounts;
 17     -- 7.执行SQL语句
 18     EXECUTE stmt;
 19     -- 8.释放资源
 20     DEALLOCATE PREPARE stmt;
 21     -- 9.获取动态SQL语句返回值
 22     SET count_date = @count_date;
 23     END
 24 -- 10.定义存储过程结束
 25 &
 26
 27 -- 2.如果存在存储过程getCount则删除
 28 DROP PROCEDURE IF EXISTS `getTableCount` &
 29 -- 3.定义存储过程,获取特定数据库表的数量
 30 -- (传入参数database_name字符串类型,为数据库名;传入参数table_name字符串类型,为表名;传出参数count_date整数类型,为数量)
 31 CREATE DEFINER=`root`@`localhost` PROCEDURE getTableCount(IN database_name CHAR(20), IN table_name CHAR(200), OUT count_date INT)
 32     BEGIN
 33     -- 4.声明变量
 34     DECLARE $sqltext VARCHAR(1000);
 35     -- 5.动态sql,把sql返回值放到@count_date中
 36     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, ‘\‘;‘);
 37     SET @sqlcounts := $sqltext;
 38     -- 6.预编释,stmt预编释变量的名称
 39     PREPARE stmt FROM @sqlcounts;
 40     -- 7.执行SQL语句
 41     EXECUTE stmt;
 42     -- 8.释放资源
 43     DEALLOCATE PREPARE stmt;
 44     -- 9.获取动态SQL语句返回值
 45     SET count_date = @count_date;
 46     END
 47 -- 10.定义存储过程结束
 48 &
 49
 50
 51
 52
 53 -- 2.如果存在存储过程getColumnCount则删除
 54 DROP PROCEDURE IF EXISTS `getColumnCount` &
 55 -- 3.定义存储过程,获取特定数据库表列的数量
 56 -- (传入参数database_name字符串类型,为数据库名;传入参数table_name字符串类型,为表名;传入参数column_name字符串类型,为列名;传出参数count_date整数类型,为数量)
 57 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)
 58     BEGIN
 59     -- 4.声明变量
 60     DECLARE $sqltext VARCHAR(1000);
 61     -- 5.动态sql,把sql返回值放到@count_date中
 62     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, ‘\‘;‘);
 63     SET @sqlcounts := $sqltext;
 64     -- 6.预编释,stmt预编释变量的名称
 65     PREPARE stmt FROM @sqlcounts;
 66     -- 7.执行SQL语句
 67     EXECUTE stmt;
 68     -- 8.释放资源
 69     DEALLOCATE PREPARE stmt;
 70     -- 9.获取动态SQL语句返回值
 71     SET count_date = @count_date;
 72     END
 73 -- 10.定义存储过程结束
 74 &
 75
 76
 77 -- 2.如果存在存储过程getColumnInfo则删除
 78 DROP PROCEDURE IF EXISTS `getColumnInfo` &
 79 -- 3.定义存储过程,获取特定数据库表列的信息
 80 -- (传入参数database_name字符串类型,为数据库名;传入参数table_name字符串类型,为表名;传入参数column_name字符串类型,为列名;传入参数column_info字符串类型,列信息;传出参数result_data字符串类型,信息)
 81 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))
 82     BEGIN
 83     -- 4.声明变量
 84     DECLARE $sqltext VARCHAR(1000);
 85     -- 5.动态sql,把sql返回值放到@count_date中
 86     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, ‘\‘;‘);
 87     SET @sqlcounts := $sqltext;
 88     -- 6.预编释,stmt预编释变量的名称
 89     PREPARE stmt FROM @sqlcounts;
 90     -- 7.执行SQL语句
 91     EXECUTE stmt;
 92     -- 8.释放资源
 93     DEALLOCATE PREPARE stmt;
 94     -- 9.获取动态SQL语句返回值
 95     SET result_data = @column_info;
 96     END
 97 -- 10.定义存储过程结束
 98 &
 99
100 -- 11.如果存在存储过程comparison则删除
101 DROP PROCEDURE IF EXISTS `comparison` &
102 -- 12.定义存储过程,获取指定数据库关键词的表列名
103 -- (传入参数database_n字符串类型,数据库名;传入参数collation_n字符串类型,具体编码类型;传入参数key_name字符串类型,为关键字;传出参数tableColumnNames字符串类型,表列名)
104 CREATE DEFINER=`root`@`localhost` PROCEDURE comparison(IN database_1 CHAR(20), IN database_2 CHAR(20), IN column_info CHAR(50), OUT info TEXT)
105     BEGIN
106     -- 13.声明变量。database_name查询出来的数据库,table_name查询出来的表名,column_name查询出来的列名,collation_name查询出来的具体编码类型
107     DECLARE database_name, table_name, column_name, collation_name, result_data_1, result_data_2 CHAR(200);
108     DECLARE this_info TEXT DEFAULT ‘‘;
109     DECLARE database_count_1, database_count_2, resoult_count INT DEFAULT 0;
110         -- 14.定义游标结束标识,默认为0
111     DECLARE stopflag INT DEFAULT 0;
112     -- 15.定义游标,其实就是临时存储sql返回的集合
113     DECLARE sql_resoult CURSOR FOR SELECT t.TABLE_SCHEMA, t.TABLE_NAME, t.COLUMN_NAME, t.COLLATION_NAME FROM information_schema.COLUMNS t;
114     -- 16.游标结束就设置为1
115     DECLARE CONTINUE HANDLER FOR NOT FOUND SET stopflag=1;
116     CALL getdatabaseCount(database_1, database_count_1);
117     CALL getdatabaseCount(database_2, database_count_2);
118     IF (database_count_1 <> 0 AND database_count_2 <> 0) THEN
119         -- 17.打开游标
120         OPEN sql_resoult;
121             -- 18.读取游标中数据,存储到指定变量
122             FETCH sql_resoult INTO database_name, table_name, column_name, collation_name;
123             -- 19.没有结束继续往下走
124             WHILE (stopflag=0) DO
125                 BEGIN
126                 -- 20.判断数据库是否为输入的数据库名称,和,指定具体编码类型,和,不含.
127                 IF (database_name=database_1) THEN
128                     -- 21.调用存储过程,获取特定表列关键词的数量
129                     CALL getTableCount(database_2, table_name, resoult_count);
130                     -- 22.如果数量不等于0,那么记录表列名
131                     IF (resoult_count <> 0) THEN
132                         CALL getColumnCount(database_2, table_name, column_name, resoult_count);
133                         -- 23.拼接字符串,不可直接用传出变量设值
134                         IF (resoult_count <> 0) THEN
135                             CALL getColumnInfo(database_1, table_name, column_name, column_info, result_data_1);
136                             CALL getColumnInfo(database_2, table_name, column_name, column_info, result_data_2);
137                             -- 23.拼接字符串,不可直接用传出变量设值
138                             IF (result_data_1 <> result_data_2) THEN
139                                 IF (this_info IS NULL OR this_info=‘‘) THEN
140                                     SET this_info=CONCAT(table_name, ‘表的‘, column_name, ‘列的‘, column_info, ‘不一样;\n‘);
141                                 ELSE
142                                     SET this_info=CONCAT(this_info, table_name, ‘表的‘, column_name, ‘列的‘, column_info, ‘不一样;\n‘);
143                                 END IF;
144                             END IF;
145                         ELSE
146                             IF (this_info IS NULL OR this_info=‘‘) THEN
147                                 SET this_info=CONCAT(database_2, ‘的‘, table_name, ‘表的‘, column_name, ‘列不存在;\n‘);
148                             ELSE
149                                 SET this_info=CONCAT(this_info, database_2, ‘的‘, table_name, ‘表的‘, column_name, ‘列不存在;\n‘);
150                             END IF;
151                         END IF;
152                     ELSE
153                         IF (this_info IS NULL OR this_info=‘‘) THEN
154                             SET this_info=CONCAT(database_2, ‘的‘, table_name, ‘表不存在;\n‘);
155                         ELSE
156                             SET this_info=CONCAT(this_info, database_2, ‘的‘, table_name, ‘表不存在;\n‘);
157                         END IF;
158                     END IF;
159                 ELSE
160                     IF (database_name=database_2) THEN
161                         CALL getTableCount(database_1, table_name, resoult_count);
162                         IF (resoult_count <> 0) THEN
163                             CALL getColumnCount(database_1, table_name, column_name, resoult_count);
164                             IF (resoult_count = 0) THEN
165                                 IF (this_info IS NULL OR this_info=‘‘) THEN
166                                     SET this_info=CONCAT(database_1, ‘的‘, table_name, ‘表的‘, column_name, ‘列不存在;\n‘);
167                                 ELSE
168                                     SET this_info=CONCAT(this_info, database_1, ‘的‘, table_name, ‘表的‘, column_name, ‘列不存在;\n‘);
169                                 END IF;
170                             END IF;
171                         ELSE
172                             IF (this_info IS NULL OR this_info=‘‘) THEN
173                                 SET this_info=CONCAT(database_1, ‘的‘, table_name, ‘表不存在;\n‘);
174                             ELSE
175                                 SET this_info=CONCAT(this_info, database_1, ‘的‘, table_name, ‘表不存在;\n‘);
176                             END IF;
177                         END IF;
178                     END IF;
179                 END IF;
180                 -- 24.读取游标中数据,存储到指定变量。(和18一样)
181                 FETCH sql_resoult INTO database_name, table_name, column_name, collation_name;
182                 END;
183             END WHILE;
184         -- 25.关闭游标
185         CLOSE sql_resoult;
186     ELSE
187         IF (database_count_1 = 0 AND database_count_2 = 0) THEN
188             SET this_info = CONCAT(database_1, ‘和‘, database_2, ‘数据库不存在或为空数据库‘);
189         ELSE
190             IF (database_count_1 = 0) THEN
191                 SET this_info = CONCAT(database_1, ‘数据库不存在或为空数据库‘);
192             ELSE
193                 SET this_info = CONCAT(database_2, ‘数据库不存在或为空数据库‘);
194             END IF;
195         END IF;
196     END IF;
197     -- 26.把数据放到传出参数
198     SET info=this_info;
199     END
200 -- 27.定义存储过程结束
201 &
202 -- 28.将mysql分隔符从&设置为;
203 DELIMITER ;
204 -- 29.设置变量
205 SET @database_1=‘my_test‘;
206 SET @database_2=‘my_test2‘;
207 SET @column_info=‘data_type‘;
208 SET @count=‘‘;
209 -- 30.调用存储过程
210 CALL comparison(@database_1, @database_2, @column_info, @count);
211 -- 31.打印
212 SELECT @count;
213 -- 32.如果存在存储过程则删除
214 DROP PROCEDURE IF EXISTS `comparison`;

原文地址:https://www.cnblogs.com/xiaostudy/p/12417151.html

时间: 2024-10-08 09:33:20

【草稿整理ing】【mysql】两个数据库结构对比的相关文章

两个数据库比较 对比视图存储过程及表结构差异

两个数据库比较 对比视图存储过程及表结构差异 一.视图和存储过程比较 [原理]利用系统表“sysobjects"和系统表“syscomments”,将数据库中的视图和存储过程进行对比.系统表"sysobjects"之前有详细介绍过,有兴趣可以看看:SQL Server系统表sysobjects介绍与使用 如果你看到这段文字,说明您正使用RSS阅读或转自<一棵树-博客园>,原文地址:http://www.cnblogs.com/atree/p/db-compare-

mysql之间数据库结构对比

适应环境:项目中对产品升级,设计到两个版本数据库结构不同 使用工具:Navicat 1.准备两个版本的数据库 2.打开工具Navicat 3.分别连接两个数据库 4.点击"工具-结构同步" 5.常规中选择两个连接的数据库进行对比,已左边数据库为模板生成不同 6.将比较出的不同文件导出,导入到新版的数据库中,两版本的数据库结构即同步完成 7.结构同步后进行数据库数据同步 8.升级完成

php同步mysql两个数据库中表的数据

分别创建两个数据库和两张表study库-zone表teaching库-area表 //****SQL脚本****// 1.创建teaching数据库area数据表 create database teaching; CREATE TABLE `area` ( `id` int(11) NOT NULL AUTO_INCREMENT, `areaID` varchar(50) CHARACTER SET utf8 DEFAULT NULL, `area` varchar(60) CHARACTER

(转载) 两个数据库比较 对比视图存储过程及表结构差异

一.视图和存储过程比较 [原理]利用系统表"sysobjects"和系统表"syscomments",将数据库中的视图和存储过程进行对比.系统表"sysobjects"之前有详细介绍过,有兴趣可以看看:SQL Server系统表sysobjects介绍与使用 [代码] /*--调用示例 exec p_compdb 'DBNAME1','DBNAME2' exec p_compdb 'DBNAME2','DBNAME3' --*/ CREATE p

利用Navicat实现MySQL数据库结构对比和同步

在生产环境中,我们总会因为这样或那样的原因导致主从不同步,亦或者是测试环境要和生产环境进行同步,利用Navicat结构同步工具,不但能找出库结构差异,还可以针对create.modify.drop等进行选择性比对,非常的人性化,那么一起来看下是如何操作的. 首先在Navicat的主界面选择工具,结构同步,这时会看到如下画面: 选择源和目标服务器,选择需要同步的数据库,选择所需的运行选项,勾选遇到错误继续. 点击比对后,就会出现同步过程,此时仅仅是比对,还未真正进行同步.点击右下角的运行同步按钮,

mysql数据优化--数据库结构的优化

1,比如存时间类型的就使用int类型   其中mysql的两个函数可以拿来使用 unix_timestamp 将时间日期转化为时间戳 from_unixtime 将时间戳转化为日期 2.ip地址存储用bigint类型 说白了 ,就是存储的字节越短越好

MYSQL两个数据库字符集保持一致问题

参考这篇文章:https://lzw.me/a/mysql-charset.html 还有一篇官方文档:https://dev.mysql.com/doc/refman/5.7/en/charset.html show variables like "%char%"; set names utf8; set character_set_server = utf8;

【数据库结构对比系列教材】同义词之间会有些什么差异

同义词 dba_synonyms表的同义词 字段名 数据类型 解释 owner 字符串 同义词的所有者 synonym_name 字符串 同义词名 table_owner 字符串 表的所有者 table_name 字符串 表名 原文地址:https://www.cnblogs.com/dbcompare/p/11239658.html

第三篇:SpringBoot - 数据库结构版本管理与迁移

SpringBoot支持了两种数据库结构版本管理与迁移,一个是flyway,一个是liquibase.其本身也支持sql script,在初始化数据源之后执行指定的脚本,本章是基于 Liquibase 开展- - Liquibase 开发人员将本地开发机器上的基于文本的文件中的数据库更改存储在本地数据库中.Changelog文件可以任意嵌套,以便更好地管理,每个变更集通常包含描述应用于数据库的更改/重构的更改.Liquibase支持对支持的数据库和原始SQL生成SQL的描述性更改.通常,每个变更