首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们是否可以在mysql中运行代码而不创建一个过程?

问我们是否可以在mysql中运行代码而不创建一个过程?
EN

Stack Overflow用户
提问于 2014-11-13 15:35:47
回答 1查看 1.5K关注 0票数 1

我希望为我的dba创建一个sql文件,该文件将检查表中是否存在索引。如果不存在-创建它。我发现了许多使用存储过程的示例,但我只想运行一次。

就像这样:

代码语言:javascript
复制
-- 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;

这可行吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-13 16:00:57

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

如果您使用准备和执行,您可以简单地形成一个字符串,如果没有索引,它具有CREATE语句,如果没有索引,则形成一个not语句(例如注释)。

代码语言:javascript
复制
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将为:

代码语言:javascript
复制
mysql> select @sql;
+-------------------------------------+
| @sql                                |
+-------------------------------------+
| SELECT 'index idx_x exists already' |
+-------------------------------------+

如果索引不存在,则@sql将是:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26912586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档