MariaDB是否有内置方法导出独立的CREATE INDEX索引创建语句?
导出MySQL独立CREATE INDEX语句的方法
方法一:通过INFORMATION_SCHEMA直接生成SQL语句
MySQL的系统表INFORMATION_SCHEMA.STATISTICS存储了所有索引的元数据,你可以用以下查询直接生成CREATE INDEX(或主键相关)语句:
导出普通索引(不含主键)
SELECT CONCAT( 'CREATE ', IF(NON_UNIQUE = 0, 'UNIQUE ', ''), 'INDEX ', INDEX_NAME, ' ON ', TABLE_SCHEMA, '.', TABLE_NAME, ' (', GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX SEPARATOR ', '), ');' ) AS create_index_stmt FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = '你的数据库名' AND TABLE_NAME = '你的表名' AND INDEX_NAME != 'PRIMARY' -- 排除主键,需要的话可删除此条件 GROUP BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, NON_UNIQUE;
导出所有索引(含主键)
主键无法用CREATE INDEX创建,需用ALTER TABLE ADD PRIMARY KEY,调整后的查询如下:
SELECT CONCAT( IF(INDEX_NAME = 'PRIMARY', 'ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' ADD PRIMARY KEY (', GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX SEPARATOR ', '), ');', CONCAT( 'CREATE ', IF(NON_UNIQUE = 0, 'UNIQUE ', ''), 'INDEX ', INDEX_NAME, ' ON ', TABLE_SCHEMA, '.', TABLE_NAME, ' (', GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX SEPARATOR ', '), ');' ) ) ) AS create_index_stmt FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = '你的数据库名' AND TABLE_NAME = '你的表名' GROUP BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, NON_UNIQUE;
执行查询后,结果列create_index_stmt就是可直接执行的索引创建语句。
方法二:用mysqldump结合文本处理工具提取
如果习惯用命令行工具,可以先导出表结构,再通过sed/grep提取索引语句并转换格式:
# 替换其中的username、your_database、your_table为实际值 mysqldump -u username -p --no-data your_database your_table | \ sed -n '/^CREATE TABLE/,/^)/p' | \ grep -E '^( UNIQUE)? KEY' | \ sed 's/^ /ALTER TABLE your_table ADD /;s/KEY/INDEX/;'
这个命令会把CREATE TABLE中的KEY/UNIQUE KEY语句转换成ALTER TABLE ADD INDEX格式,适合快速提取。
内容的提问来源于stack exchange,提问作者Luc
相关产品推荐
相关产品推荐

