草稿整理后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`;

总结

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

(0)

相关推荐

  • MySQL数据库三种常用存储引擎特性对比

    MySQL 的存储引擎可能是所有关系型数据库产品中最具有特色的了,不仅可以同时使用多种存储引擎,而且每种存储引擎和MySQL之间使用插件方式这种非常松的耦合关系. 由于各存储引擎功能特性差异较大,这篇文章主要是介绍如何来选择合适的存储引擎来应对不同的业务场景. MyISAM 特性 不支持事务:MyISAM存储引擎不支持事务,所以对事务有要求的业务场景不能使用 表级锁定:其锁定机制是表级索引,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能 读写互相阻塞:不仅会在写入的时候阻塞读取,M

  • PHP数据库连接mysql与mysqli对比分析

    一.mysql与mysqli的概念相关 1.mysql与mysqli都是php方面的函数集,与mysql数据库关联不大. 2.在php5版本之前,一般是用php的mysql函数去驱动mysql数据库的,比如mysql_query()的函数,属于面向过程3.在php5版本以后,增加了mysqli的函数功能,某种意义上讲,它是mysql系统函数的增强版,更稳定更高效更安全,与mysql_query()对应的有mysqli_query(),属于面向对象,用对象的方式操作驱动mysql数据库 二.mys

  • Mysql数据库支持的存储引擎对比

    目录 存储引擎 MySQL支持的存储引擎 并发控制 锁 锁颗粒 事务 外键 索引 各种存储引擎的特点 存储引擎 Mysql可以将数据以不同的技术存储在文件(内存)中,这种技术就称为存储引擎. 每一种存储引擎使用不同的存储机制.索引技巧.锁定水平,最终提供广泛且不同的功能. MySQL支持的存储引擎 MyISAM InnoDB Memory CSV Archive 并发控制 当多个连接对记录进行修改时保证数据的一致性和完整性. 锁 1.共享锁(读锁):在同一时间段内,多个用户可以读取同一个资源,读

  • php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例

    本文实例讲述了php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率.分享给大家供大家参考,具体如下: <?php /** * 测试pdo和mysqli的执行效率 */ header("Content-type:text/html;charset=utf-8"); //通过pdo链接数据库 $pdo_startTime = microtime(true); $pdo = new PDO("mysql:host=localhost;dbname=test&

  • MySql数据库单表查询与多表连接查询效率对比

    这段时间在做项目的过程中,遇到一个模块,数据之间的联系很复杂,在建表的时候就很纠结,到底该怎么去处理这些复杂的数据呢,是单表查询,然后在业务层去处理数据间的关系,还是直接通过多表连接查询来处理数据关系呢? 通过查阅资料和阅读博客,有以下两个回答: 一.<高性能mysql>中的回答 很多高性能的应用都会对关联查询进行分解.简单地,可以对每个表进行一次单表查询,然后将结果在应用程序中进行关联.例如,下面这个查询: select * from tag join tag_post on tag_pos

  • php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例

    本文实例讲述了php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率.分享给大家供大家参考,具体如下: <?php /** * 测试pdo和mysqli的连接效率,各连接100次mysql数据库 */ header("Content-type:text/html;charset=utf8"); //通过pdo链接数据库 $pdo_startTime = microtime(true); for($i=1;$i<=100;$i++){ $pdo = new P

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

    目录 1.草稿: 2.整理: 3.无注释 总结 1.草稿: -- 1.将mysql分隔符从;设置为& DELIMITER & -- 2.如果存在存储过程getdatabaseCount则删除 DROP PROCEDURE IF EXISTS `getdatabaseCount` & -- 3.定义存储过程,获取特定数据库的数量 -- (传入参数database_name字符串类型,为数据库名:传出参数count_date整数类型,为数量) CREATE DEFINER=`root`

  • python 两个数据库postgresql对比

    这篇文章主要介绍了python 两个数据库postgresql对比,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 比较两个postgresql数据库,原理 比较数据库中各表的大小 1. 数据库查询语句 2. python字典比较 import psycopg2 import sys class PdbModel: def __init__(self, host, dbname, username='postgres', password='po

  • mysql 导入导出数据库以及函数、存储过程的介绍

    mysql常用导出数据命令:1.mysql导出整个数据库  mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql   mysqldump -hlocalhost -uroot hqgr> hqgr.sql     (如果root用户没用密码可以不写-p,当然导出的sql文件你可以制定一个路径,未指定则存放在mysql的bin目录下) 2.mysql导出数据库一个表 mysqldump -hhostnam

  • MySQL数据库结构和数据的导出和导入

    正在看的db2教程是:MySQL数据库结构和数据的导出和导入. 导出要用到MySQL的mysqldump工具,基本用法是: shell> mysqldump [OPTIONS] database [tables] 如果你不给定任何表,整个数据库将被导出. 通过执行mysqldump --help,你能得到你mysqldump的版本支持的选项表. 注意,如果你运行mysqldump没有--quick或--opt选项,mysqldump将在导出结果前装载整个结果集到内存中,如果你正在导出一个大的数据

  • 完美解决phpstudy安装后mysql无法启动(无需删除原数据库,无需更改任何配置,无需更改端口)直接共存

    今天学习php,当然是要先安装好运行环境了,phpstyudy是一个运行php的集成环境, 一键安装对新手很友好,与时作为一个新手,便跟着教程安装了phpstudy集成环境. 很快安装好了,嗯.对新手确实很友好.phpmyadmin,Apache,php直接配置安装好了.省去了很多时间. 可是安装后却遇到一个麻烦事,就是这个Mysql启动后就会过几秒就显示Mysql已经停止(这个是我现在的我已经解决这个问题了,应该是个红色的方框,不要介意,/嘿嘿).重启了很多遍.还是无法启动. 这个时候不仅ph

  • MySQL安装后默认自带数据库的作用详解

    大家在学习MySQL时,安装后都会发现里边已经自带了几个默认的数据库,我装的MySQL5.5里边自带六个数据库 网上查了一些资料对这几个数据库的功能做一下学习. 1.information_schema 这个库中有很多的表 information_schema数据库表说明: SCHEMATA表:提供了当前mysql实例中所有数据库的信息.是show databases的结果取之此表. TABLES表:提供了关于数据库中的表的信息(包括视图).详细表述了某个表属于哪个schema,表类型,表引擎,

  • 用python生成mysql数据库结构文档

    最近因为项目原因需要编写数据库设计文档,但是由于数据表太多,手动编写耗费的时间太久,所以搞了一个简单的脚本快速生成数据库结构,保存到word文档中. 安装pymysql和document pip install pymysql pip install document 脚本 # -*- coding: utf-8 -*- import pymysql from docx import Document from docx.shared import Pt from docx.oxml.ns im

  • Mysql 数据库结构及索引类型

    目录 前言 数据库索引的数据结构 聚集索引 辅助索引 索引管理 联合索引 覆盖索引 总结 前言 数据库索引是mysql数据库中重要的组成部分,是数据库查询数据速度提升的关键,本文将介绍数据库索引的一些内容. 数据库索引的数据结构 在数据库中的索引方法中,有TREE和HASH两种方法,HASH是经常使用的,本文中主要介绍TREE的数据结构.B+Tree 的高度一般是2-4层,也就是说查找一条数据记录,最多使用 2-4 次 IO,当前一般的机械磁盘每秒至少可以做 100 次 IO, 2-4 词的 I

  • Mysql入门基础 数据库创建篇

    1.创建数据表---基础(高手跳过) 正统方法:create [TEMPORARY] table 表名 [if not exists] (创建的列项定义) [表的选项] [分区的选项];#正统的创建方式,具体的参数,请参考mysql手册,在这里不做详细的解释,只说一些比较特别的. 例: 复制代码 代码如下: create table user(id int unsigned not null auto_increment, username char(15), sex enum('M','F')

  • 详解mysql 中的锁结构

    Mysql 支持3中锁结构 表级锁,开销小,加锁快,不会出现死锁,锁定的粒度大,冲突概率高,并发度最低 行级锁,开销小,加锁慢,会出现死锁,锁定粒度小,冲突概率最低,并发度最高 页面锁,开销和加锁处于表锁和行锁之间,会出现死锁,锁粒度基于表和行之间,并发一般 InnoDB锁问题 InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.  行级锁和表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题. InnoDB的行锁模式及加锁方法 Inn

随机推荐