从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两个视图。
来源:CSDN
作者:w1346561235
链接:https://blog.csdn.net/w1346561235/article/details/103663178