前言:
今天跑脚本的时候,发现了一个错误:Too many keys specified; max 64 keys allowed,开始一脸懵逼,看脚本去。
环境:
mysql8
分析:
ALTER TABLE `table_t` ADD UNIQUE(`c`);这句话简单的将字段c添加了唯一约束。如果脚本只是这样写的话,没执行一次这个sql语句,数据库都会新增一个新的索引值,c,c_1.c_2直到超出了mysql索引数目64,然后报错:Too many keys specified; max 64 keys allowed。
解决:
编写sql脚本的时候必须严格按照要求规范来写:
DROP PROCEDURE IF EXISTS aaa; DELIMITER // CREATE PROCEDURE aaa() BEGIN IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA= 'database_name' AND TABLE_NAME = 'table_name' AND CONSTRAINT_NAME = 'column_name') THEN ALTER TABLE `database_name`.`table_name` ADD UNIQUE KEY `index_name` (`column_name`); END IF; END // DELIMITER ; CALL aaa();
脏数据的处理:
这个处理网上搜了比较的资料了,还没有一个好的批量修改的方式。暂时解决就是手动删除索引。
SELECT DISTINCT(CONCAT('drop index ', INDEX_NAME, ' on ', TABLE_NAME, ';'))
FROM information_schema.`STATISTICS` WHERE TABLE_SCHEMA= 'database_name' AND TABLE_NAME='table_name' AND INDEX_NAME LIKE '%index_name%';
这个sql可以得到多个删除索引的语句,但咋跑起来,暂时还没弄,有空再来吧(虽然不大可能了,除非工作必要,哈哈)。