利用 information_schema.STATISTICS 與 COLUMNS 表,動態生成 CREATE INDEX、ALTER TABLE ... ADD PRIMARY KEY、DROP INDEX 等 DDL,避免手工拼寫,支援遷移、審計、版本控制。
SELECT CONCAT(
'ALTER TABLE `', TABLE_NAME, '` MODIFY COLUMN `', COLUMN_NAME,
'` ', IF(UPPER(DATA_TYPE)='INT',
REPLACE(SUBSTRING_INDEX(UPPER(COLUMN_TYPE),')',1),'INT','INTEGER'),
UPPER(COLUMN_TYPE)
), ') UNSIGNED NOT NULL AUTO_INCREMENT;'
) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'source_db' AND EXTRA = 'AUTO_INCREMENT'
ORDER BY TABLE_NAME;
SELECT CONCAT(
'ALTER TABLE `', TABLE_NAME, '` ADD ',
IF(NON_UNIQUE=1,
CASE UPPER(INDEX_TYPE)
WHEN 'FULLTEXT' THEN 'FULLTEXT INDEX'
WHEN 'SPATIAL' THEN 'SPATIAL INDEX'
ELSE CONCAT('INDEX `', INDEX_NAME, '` USING ', INDEX_TYPE)
END,
IF(UPPER(INDEX_NAME)='PRIMARY',
CONCAT('PRIMARY KEY USING ', INDEX_TYPE),
CONCAT('UNIQUE INDEX `', INDEX_NAME, '` USING ', INDEX_TYPE)
)
),
'(', GROUP_CONCAT(DISTINCT CONCAT('`', COLUMN_NAME, '`') ORDER BY SEQ_IN_INDEX), ');'
) AS Create_Index_SQL
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'target_db'
GROUP BY TABLE_NAME, INDEX_NAME
ORDER BY TABLE_NAME, INDEX_NAME;
SELECT CONCAT(
'ALTER TABLE `', TABLE_NAME, '` MODIFY COLUMN `', COLUMN_NAME,
'` ', IF(UPPER(DATA_TYPE)='INT',
REPLACE(SUBSTRING_INDEX(UPPER(COLUMN_TYPE),')',1),'INT','INTEGER'),
UPPER(COLUMN_TYPE)
), ') UNSIGNED NOT NULL;'
) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'dest_db' AND EXTRA = 'AUTO_INCREMENT'
ORDER BY TABLE_NAME;
SELECT CONCAT(
'ALTER TABLE `', TABLE_NAME, '` ',
GROUP_CONCAT(DISTINCT CONCAT(
'DROP ', IF(UPPER(INDEX_NAME)='PRIMARY','PRIMARY KEY',CONCAT('INDEX `', INDEX_NAME, '`'))
) SEPARATOR ', '), ';'
) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'dest_db'
GROUP BY TABLE_NAME
ORDER BY TABLE_NAME;
pt-online-schema-change 避免鎖表。PRIMARY KEY 自動創建 UNIQUE INDEX;UNIQUE KEY 即唯一約束+唯一索引;KEY/INDEX 同義(普通索引)。通過 information_schema 動態生成 DDL,實現索引/約束的可視化、可版本化、可自動化管理,是大規模庫表遷移與治理的基礎工具。