mysql - 创建前判断MySQL表索引是否存在

标签 mysql stored-procedures indexing

我们系统的自动数据库迁移过程涉及运行包含新表定义及其随附索引的 .sql 脚本。

我只需要在这些表和索引不存在时才能够创建它们。使用 IF NOT EXISTS 处理表,但在创建索引时不存在此类语法。

我已经尝试编写一个存储过程,如下所示,但这可能会失败,因为您无法从 show 语句中进行选择。

DELIMITER $$
DROP PROCEDURE IF EXISTS csi_add_index $$
CREATE PROCEDURE csi_add_index(in theTable varchar(128), in theIndexName varchar(128), in theIndexColumns varchar(128)  )
BEGIN
 IF(((SELECT COUNT(*) FROM (SHOW KEYS FROM theTable WHERE key_name = theIndexName)) tableInfo = 0) THEN
   SET @s = CONCAT('CREATE INDEX ' , theIndexName , ' ON ' , theTable, '(', theIndexColumns, ')');
   PREPARE stmt FROM @s;
   EXECUTE stmt;
 END IF;
END $$

我考虑过删除并重新创建,但是这个过程,因为它存在,假设它不会遇到任何错误,因此我想先检查是否存在。

是否有另一种方法来检索表的索引以在创建之前检查索引是否已经存在,或者有人可以建议更好的方法来管理它吗?

编辑:请注意,这是一个自动化过程,没有人为干预。

最佳答案

SELECT INDEX_NAME FROM INFORMATION_SCHEMA.STATISTICS WHERE
`TABLE_CATALOG` = 'def' AND `TABLE_SCHEMA` = DATABASE() AND
`TABLE_NAME` = theTable AND `INDEX_NAME` = theIndexName

关于mysql - 创建前判断MySQL表索引是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3626645/

相关文章:

mysql - 错误 2002 (HY000) : Can't connect to local MySQL server through socket '/tmp/mysqld.sock' (2)

mysql - 将结果从 MySQL 过程传递到 Linux 命令行

php - 1452 无法添加或更新子行 : a foreign key constraint fails Laravel 5. 4

mysql 全文匹配括号分组不起作用

java - 存储过程调用(namedparameterjdbctemplate)

python - 按百分比随机划分并存储 SQL 表

sql - MySql从存储过程中调用存储函数导致错误

Python - 索引错误 : string index out of range (Beginner)

python - 如何找到列表中值的索引,增加值?

javascript - 编辑对象 jQuery 的属性