gpt4 book ai didi

mysql - 我们可以在不创建过程的情况下在 mysql 中运行代码吗

转载 作者:行者123 更新时间:2023-11-29 00:07:24 24 4
gpt4 key购买 nike

我想为我的 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;

这可行吗?

最佳答案

MySQL 不支持存储例程或触发器之外的 IF/THEN/ELSE 结构。

如果您使用 PREPARE 和 EXECUTE,您可以简单地形成一个字符串,如果没有索引则包含 CREATE INDEX 语句,如果没有则包含空操作语句(例如注释)。

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`) |
+----------------------------------------+

顺便说一句,所有 CREATE 和 ALTER 语句都在语句前后隐式提交,因此以您的方式使用启动事务和提交没有任何意义。参见 http://dev.mysql.com/doc/refman/5.6/en/implicit-commit.html

关于mysql - 我们可以在不创建过程的情况下在 mysql 中运行代码吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26912586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com