我希望为我的dba创建一个sql文件,该文件将检查表中是否存在索引。如果不存在-创建它。我发现了许多使用存储过程的示例,但我只想运行一次。
就像这样:
-- Creates an index if it does not already exist in MySQL.
START TRANSACTION;
SET IndexIsThere = 0;
SET given_table = 'IDR_CHGS';
SET given_index = 'FK_IDR_PATIENT_PT_ID_idx1';
SELECT COUNT(1) INTO IndexIsThere
FROM INFORMATION_SCHEMA.STATISTICS
WHERE table_name = given_table
AND index_name = given_index;
IF IndexIsThere = 0 THEN
SET @sqlstmt = CONCAT('CREATE INDEX ',given_index,' ON ', given_database,'.',given_table,' (',given_columns,')');
PREPARE st FROM @sqlstmt;
EXECUTE st;
DEALLOCATE PREPARE st;
SELECT CONCAT('Created index ', given_table,'.', given_index, ' on columns ', given_columns) AS 'CreateIndex status';
ELSE
SELECT CONCAT('Index ', given_index,' Already Exists on Table ', given_database,'.',given_table) AS 'CreateIndex status';
END IF;
COMMIT;这可行吗?
发布于 2014-11-13 16:00:57
MySQL不支持存储例程或触发器之外的IF/‘t/ELSE构造。
如果您使用准备和执行,您可以简单地形成一个字符串,如果没有索引,它具有CREATE语句,如果没有索引,则形成一个not语句(例如注释)。
SELECT COALESCE(CONCAT('SELECT \'index ', S.INDEX_NAME, ' exists already\''),
'CREATE INDEX `idx_x` ON test.foo (`x`)') INTO @sql
FROM (SELECT NULL) AS d
LEFT OUTER JOIN INFORMATION_SCHEMA.STATISTICS AS S
ON (S.TABLE_SCHEMA, S.TABLE_NAME, S.INDEX_NAME) = ('test', 'foo', 'idx_x');
PREPARE s from @sql;
EXECUTE s;如果存在索引,则@sql将为:
mysql> select @sql;
+-------------------------------------+
| @sql |
+-------------------------------------+
| SELECT 'index idx_x exists already' |
+-------------------------------------+如果索引不存在,则@sql将是:
mysql> select @sql;
+----------------------------------------+
| @sql |
+----------------------------------------+
| CREATE INDEX `idx_x` ON test.foo (`x`) |
+----------------------------------------+顺便说一句,在语句之前和之后,所有的创建和修改语句都是隐式提交的,因此,以您所做的方式使用start事务和commit是没有意义的。请参阅http://dev.mysql.com/doc/refman/5.6/en/implicit-commit.html
https://stackoverflow.com/questions/26912586
复制相似问题