Mysql表结构同步存储过程(适用于模版表)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: Mysql表结构同步存储过程(适用于模版表)

Mysql表结构同步

流水模版表新增字段需要同步到所有区域年份的流水表

CREATE DEFINER=`root`@`%` PROCEDURE `SyncTableStructure`(IN sourceTable VARCHAR(255), IN targetTable VARCHAR(255))
BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE columnName VARCHAR(255);
    DECLARE columnType VARCHAR(255);
    DECLARE isNullable VARCHAR(3);
    DECLARE columnDefault TEXT;
    DECLARE extra VARCHAR(255);
    -- 游标查询源表的列结构
    DECLARE columnCursor CURSOR FOR
        SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT, EXTRA
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = sourceTable;
    -- 当遍历完所有行时,关闭游标
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    -- 打开游标
    OPEN columnCursor;
    read_loop: LOOP
        -- 读取游标中的一行
        FETCH columnCursor INTO columnName, columnType, isNullable, columnDefault, extra;
        
        IF done THEN
            LEAVE read_loop;
        END IF;
        -- 检查目标表中是否存在该列
        IF NOT EXISTS (
            SELECT * FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = targetTable AND COLUMN_NAME = columnName
        ) THEN
            -- 构建ALTER TABLE语句,添加新列
            SET @alterSQL = CONCAT('ALTER TABLE ', targetTable, ' ADD COLUMN ', columnName, ' ', columnType);
            
            -- 处理可为空字段
            IF isNullable = 'NO' THEN
                SET @alterSQL = CONCAT(@alterSQL, ' NOT NULL');
            END IF;
            
            -- 处理默认值
            IF columnDefault IS NOT NULL THEN
                SET @alterSQL = CONCAT(@alterSQL, ' DEFAULT ', QUOTE(columnDefault));
            END IF;
            -- 处理额外属性(如AUTO_INCREMENT)
            IF extra != '' THEN
                SET @alterSQL = CONCAT(@alterSQL, ' ', extra);
            END IF;
            -- 执行ALTER TABLE语句
            PREPARE stmt FROM @alterSQL;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;
        END IF;
    END LOOP;
    -- 关闭游标
    CLOSE columnCursor;
END

调用

CALL SyncTableStructure('dev_log', 'dev_log_city_2024');

一个模版结构同步到多个表上

CREATE DEFINER=`root`@`%` PROCEDURE `SyncDevDataTablesStructure`()
BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE currentTable VARCHAR(255);
    DECLARE columnName VARCHAR(255);
    DECLARE columnType VARCHAR(255);
    DECLARE isNullable VARCHAR(3);
    DECLARE columnDefault TEXT;
    DECLARE extra VARCHAR(255);
    -- 硬编码的源表和目标表前缀
    DECLARE sourceTableName VARCHAR(255) DEFAULT 'dev_log';
    DECLARE tablePrefix VARCHAR(255) DEFAULT 'dev_log_';
    -- 定义游标,用于查找所有符合前缀的表
    DECLARE tableCursor CURSOR FOR
        SELECT TABLE_NAME 
        FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME LIKE CONCAT(tablePrefix, '%');
    -- 定义游标,用于查找源表的列结构
    DECLARE columnCursor CURSOR FOR
        SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT, EXTRA
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = sourceTableName;
    -- 处理游标读取结束的情况
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    -- 调试输出 sourceTableName 的值
    SELECT CONCAT('sourceTableName: ', sourceTableName) AS debug_output;
    -- 打开表游标
    OPEN tableCursor;
    table_loop: LOOP
        -- 获取一个表名
        FETCH tableCursor INTO currentTable;
        -- 调试输出 currentTable 的值
        SELECT CONCAT('tableName: ', currentTable) AS debug_output;
        IF done THEN
            LEAVE table_loop;
        END IF;
        -- 打开列游标
        SET done = 0;
        OPEN columnCursor;
        column_loop: LOOP
            -- 读取游标中的一行
            FETCH columnCursor INTO columnName, columnType, isNullable, columnDefault, extra;
            IF done THEN
                LEAVE column_loop;
            END IF;
            -- 检查目标表中是否存在该列
            IF NOT EXISTS (
                SELECT * FROM INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = currentTable AND COLUMN_NAME = columnName
            ) THEN
                -- 构建ALTER TABLE语句,添加新列
                SET @alterSQL = CONCAT('ALTER TABLE ', currentTable, ' ADD COLUMN ', columnName, ' ', columnType);
                -- 处理可为空字段
                IF isNullable = 'NO' THEN
                    SET @alterSQL = CONCAT(@alterSQL, ' NOT NULL');
                END IF;
                -- 处理默认值
                IF columnDefault IS NOT NULL THEN
                    SET @alterSQL = CONCAT(@alterSQL, ' DEFAULT ', QUOTE(columnDefault));
                END IF;
                -- 处理额外属性(如AUTO_INCREMENT)
                IF extra != '' THEN
                    SET @alterSQL = CONCAT(@alterSQL, ' ', extra);
                END IF;
                -- 执行ALTER TABLE语句
                PREPARE stmt FROM @alterSQL;
                EXECUTE stmt;
                DEALLOCATE PREPARE stmt;
            END IF;
        END LOOP;
        -- 关闭列游标
        CLOSE columnCursor;
    END LOOP;
    -- 关闭表游标
    CLOSE tableCursor;
END
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
11月前
|
安全 关系型数据库 MySQL
如何将数据从MySQL同步到其他系统
【10月更文挑战第17天】如何将数据从MySQL同步到其他系统
1528 0
|
27天前
|
存储 关系型数据库 MySQL
使用命令行cmd查询MySQL表结构信息技巧分享。
掌握了这些命令和技巧,您就能快速并有效地从命令行中查询MySQL表的结构信息,进而支持数据库维护、架构审查和优化等工作。
164 9
|
6月前
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
7月前
|
存储 Java 关系型数据库
java调用mysql存储过程
在 Java 中调用 MySQL 存储过程主要借助 JDBC(Java Database Connectivity)。其核心原理是通过 JDBC 与 MySQL 建立连接,调用存储过程并处理结果。具体步骤包括:加载 JDBC 驱动、建立数据库连接、创建 CallableStatement 对象、设置存储过程参数并执行调用。此过程实现了 Java 程序与 MySQL 数据库的高效交互。
|
6月前
|
存储 关系型数据库 MySQL
【YashanDB知识库】MySQL返回结果集的存储过程的改写方法
本文介绍了将MySQL存储过程改写至YashanDB的解决方案。由于MySQL存储过程可直接返回结果集,而YashanDB需通过返回SYS_REF_CURSOR的函数实现类似功能,因此需要对代码进行转换。示例中展示了如何将MySQL存储过程`proc1`改写为YashanDB函数,并调整JDBC应用代码以适配REF_CURSOR输出参数,从而正确获取查询结果。此方法确保了跨数据库场景下的兼容性与功能性。
|
9月前
|
监控 关系型数据库 MySQL
Flink CDC MySQL同步MySQL错误记录
在使用Flink CDC同步MySQL数据时,常见的错误包括连接错误、权限错误、表结构变化、数据类型不匹配、主键冲突和
406 17
|
10月前
|
存储 SQL NoSQL
|
11月前
|
存储 SQL 关系型数据库
MySql数据库---存储过程
MySql数据库---存储过程
137 5
|
11月前
|
存储 关系型数据库 MySQL
MySQL 存储过程返回更新前记录
MySQL 存储过程返回更新前记录
165 3
|
11月前
|
SQL 存储 关系型数据库
Mysql主从同步 清理二进制日志的技巧
Mysql主从同步 清理二进制日志的技巧
112 1

推荐镜像

更多