从mysql元数据表中通过sql 构造/还原/生成 建表语句

。_饼干妹妹 提交于 2019-12-23 19:46:12

从mysql元数据表中通过sql 构造/还原/生成 建表语句

 set @schema := 'zabbix';

SELECT 
    d.sql_script
FROM
    (SELECT 
        c1.*
    FROM
        (SELECT 
        1 typ_seq,
            table_name,
            CONCAT('create table "', UPPER(table_name), '"(') sql_script,
            0 inner_seq
    FROM
        information_schema.tables
    WHERE
        `TABLE_SCHEMA` = @schema UNION ALL SELECT 
        2, table_name, sql_script, inner_seq
    FROM
        (SELECT 
        table_name,
            CONCAT(IF(a.`ORDINAL_POSITION` = 1, '', ','), '"', UPPER(column_name), '" ',  COLUMN_TYPE, CASE
                WHEN
                    COLUMN_DEFAULT IS NULL
                        OR TRIM(COLUMN_DEFAULT) = ''
                THEN
                    ''
                ELSE CONCAT(' DEFAULT ', CASE
                    WHEN data_type IN ('bigint' , 'int', 'decimal', 'tinyint', 'float', 'smallint', 'date', 'double', 'time','datetime') THEN COLUMN_DEFAULT
                    ELSE CONCAT('\'', COLUMN_DEFAULT, '\'')
                END)
            END, IF(IS_NULLABLE = 'NO', '  ', ''),  extra ) sql_script,
            ordinal_position inner_seq
    FROM
        information_schema.columns a
    WHERE
        a.`TABLE_SCHEMA` = @schema
    ORDER BY TABLE_NAME , ORDINAL_POSITION) t2 UNION ALL SELECT 
        3,
            tc.TABLE_NAME,
            CONCAT(',', tc.CONSTRAINT_TYPE, '(', GROUP_CONCAT(CONCAT('"', UPPER(kcu.`COLUMN_NAME`), '"')
                ORDER BY kcu.`ORDINAL_POSITION`
                SEPARATOR ','), ')'),
            CASE tc.CONSTRAINT_TYPE
                WHEN 'PRIMARY KEY' THEN 1
                ELSE 3
            END
    FROM
        information_schema.TABLE_CONSTRAINTS tc, information_schema.key_column_usage kcu
    WHERE
        tc.`TABLE_SCHEMA` = @schema
            AND kcu.`TABLE_SCHEMA` = @schema
            AND kcu.`TABLE_SCHEMA` = tc.`TABLE_SCHEMA`
            AND kcu.`CONSTRAINT_NAME` = tc.`CONSTRAINT_NAME`
            AND kcu.`TABLE_NAME` = tc.`TABLE_NAME`
            AND tc.CONSTRAINT_TYPE NOT IN ('FOREIGN KEY')
    GROUP BY tc.`TABLE_NAME` , tc.`CONSTRAINT_NAME` , kcu.`REFERENCED_TABLE_NAME` UNION ALL SELECT 
        4 typ_seq, table_name, ');' sql_script, 0 inner_seq
    FROM
        tables
    WHERE
        `TABLE_SCHEMA` = @schema UNION ALL SELECT 
        5,
            table_name,
            CONCAT('comment on column "', UPPER(table_name), '"."', UPPER(column_name), '"', ' is \'', REPLACE(REPLACE(COLUMN_COMMENT, CHAR(13), ''), CHAR(10), ''), '\';'),
            ORDINAL_POSITION
    FROM
        information_schema.columns
    WHERE
        `TABLE_SCHEMA` = @schema
            AND LENGTH(TRIM(COLUMN_COMMENT)) > 0 UNION ALL SELECT 
        typ_seq, table_name, sql_script, inner_seq
    FROM
        (SELECT 
        6 typ_seq,
            table_name,
            @rownum:=@rownum + 1 rn,
            CONCAT('create  index "', CONCAT(UPPER(s.`INDEX_NAME`), '_', @rownum), '" on "', UPPER(s.`TABLE_NAME`), '"(', GROUP_CONCAT(CONCAT('"', UPPER(s.`COLUMN_NAME`), '"')
                ORDER BY s.`SEQ_IN_INDEX`
                SEPARATOR ','), ');') sql_script,
            @rownum inner_seq
    FROM
        information_schema.`STATISTICS` s, (SELECT @rownum:=0 FROM DUAL) s1
    WHERE
        s.`TABLE_SCHEMA` = @schema
            AND s.`NON_UNIQUE` = 1
    GROUP BY s.`TABLE_NAME` , s.`INDEX_NAME`) ss) c1
    LEFT JOIN information_schema.INNODB_SYS_TABLES c2 ON (c2.name LIKE CONCAT(@schema, '%')
        AND c1.table_name = SUBSTR(c2.name, LENGTH(@schema) + 2))
    ORDER BY IF(c2.table_id IS NULL, 9999999, c2.table_id) , typ_seq , inner_seq) d 
UNION ALL SELECT 
    sql_script
FROM
    (SELECT 
        c3.*, c4.`TABLE_ID`, c4.name
    FROM
        (SELECT 
        7 typ_seq,
            kcu1.TABLE_NAME,
            CONCAT('alter table "', UPPER(kcu1.TABLE_NAME), '" add constraint "', UPPER(kcu1.`CONSTRAINT_NAME`), '_', @rownum:=@rownum + 1, '" FOREIGN KEY ', '(', GROUP_CONCAT(CONCAT('"', UPPER(kcu1.`COLUMN_NAME`), '"')
                ORDER BY kcu1.`ORDINAL_POSITION`
                SEPARATOR ','), ')', CONCAT(' references "', UPPER(kcu1.REFERENCED_TABLE_NAME), '"(', GROUP_CONCAT(CONCAT('"', UPPER(kcu1.`REFERENCED_COLUMN_NAME`), '"')
                ORDER BY kcu1.`ORDINAL_POSITION`
                SEPARATOR ','), ')', ' ON DELETE ', CASE
                WHEN rc1.DELETE_RULE IN ('RESTRICT' , 'NO ACTION') THEN ' NO ACTION '
                ELSE rc1.DELETE_RULE
            END, ' ON UPDATE ', CASE
                WHEN rc1.UPDATE_RULE IN ('RESTRICT' , 'NO ACTION') THEN ' NO ACTION '
                ELSE rc1.UPDATE_RULE
            END, ' WITH INDEX '), ';') sql_script,
            1 inner_seq
    FROM
        information_schema.key_column_usage kcu1, information_schema.REFERENTIAL_CONSTRAINTS rc1, (SELECT @rownum:=0 FROM DUAL) rn1
    WHERE
        kcu1.`TABLE_SCHEMA` = @schema
            AND kcu1.`CONSTRAINT_NAME` = rc1.`CONSTRAINT_NAME`
            AND kcu1.`CONSTRAINT_SCHEMA` = rc1.`CONSTRAINT_SCHEMA`
            AND kcu1.`TABLE_NAME` = rc1.`TABLE_NAME`
            AND kcu1.`REFERENCED_TABLE_SCHEMA` = rc1.UNIQUE_CONSTRAINT_SCHEMA
            AND kcu1.`REFERENCED_TABLE_NAME` = rc1.`REFERENCED_TABLE_NAME`
    GROUP BY kcu1.`TABLE_NAME` , kcu1.`CONSTRAINT_NAME`) c3
    LEFT JOIN information_schema.INNODB_SYS_TABLES c4 ON (c4.name LIKE CONCAT(@schema, '%')
        AND c3.table_name = SUBSTR(c4.name, LENGTH(@schema) + 2))
    ORDER BY IF(c4.table_id IS NULL, 9999999, c4.table_id) , typ_seq , inner_seq) c5;

 

通过sql构造function与procedure也是类似的方法,使用information_schema.routines与information_schema.parameters两个视图。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!