Пакетное изменение имени индекса в базе данных Mysql

В процессе разработки должны были быть ситуации, когда необходимо было пакетно изменить имя индекса в определенной библиотеке.Все еще проблематично изменить одну таблицу за одной таблицей.Следующий sql генерирует оператор модификации для всех индексов в указанной база данных в формате индекса 表名_字段名:

Формат имени составного индекса 表名_组合索引字段名1_组合索引字段名2.....может быть изменен, если есть другие требования, обратите внимание на изменение указанного имени базы данных
перед использованием ;table_schema

-- 批量更新索引名的sql
-- 查询出所有组合索引,并拼接修改索引名的语句
SELECT
	CONCAT( 'ALTER TABLE `', table_name, '` RENAME INDEX `', index_name, '` TO `', table_name, '_', GROUP_CONCAT( column_name ORDER BY seq_in_index SEPARATOR '_' ), '`;' ) AS RENAME_SQL 
FROM
	information_schema.statistics 
WHERE
	table_schema = 'asset_manage_local' 
	AND index_name != 'PRIMARY' 
GROUP BY
	table_name,
	index_name 
HAVING
	COUNT(*) > 1 -- 只处理组合索引
	UNION ALL
-- 查询出所有非组合索引,并拼接修改索引名的语句
SELECT
	CONCAT(
		'ALTER TABLE `',
		table_name,
		'` RENAME INDEX `',
		index_name,
		'` TO `',
		table_name,
		'_',
		column_name,
	IF
		( sub_part IS NOT NULL, CONCAT( '(', sub_part, ')' ), '' ),
		'`;' 
) AS RENAME_SQL 
FROM
	information_schema.statistics 
WHERE
	table_schema = 'asset_manage_local' 
	AND index_name != 'PRIMARY' 
	AND seq_in_index = 1 
	AND index_name NOT IN ( SELECT index_name FROM information_schema.statistics WHERE table_schema = 'asset_manage_local' GROUP BY table_name, index_name HAVING COUNT(*) > 1 -- 过滤掉组合索引
	);

Guess you like

Origin blog.csdn.net/TangBoBoa/article/details/130412474