【发布时间】:2011-04-07 07:11:37
【问题描述】:
我们系统的自动数据库迁移过程涉及运行 .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 $$
我考虑过删除并重新创建,但该过程,因为它存在,假设它不会遇到错误,因此我想先检查是否存在。
是否有另一种方法来检索表的索引以在创建之前检查索引是否已经存在,或者任何人都可以提出更好的方法来管理它?
编辑:请注意,这是一个自动化程序,无需人工干预。
【问题讨论】:
标签: mysql stored-procedures indexing