【问题标题】:If conditional in SQL Script for Mysql如果在 Mysql 的 SQL 脚本中有条件
【发布时间】:2011-11-15 03:07:14
【问题描述】:

在执行顺序执行的 sql 脚本中,有没有一种方法可以引入 IF THEN ELSE 条件来控制查询执行流程?

我碰巧遇到了这个http://www.bennadel.com/blog/1340-MySQL-Does-Not-Support-IF-ELSE-Statements-In-General-SQL-Work-Flow.htm 这表示 IF THEN ELSE 在 sql 脚本中不起作用。

还有其他方法吗?

基本上,我想运行一个特定的“从表中选择 colName”命令并检查 colName 是否对应于特定值。如果是这样,请继续执行脚本的其余部分。否则,停止执行。

请指教。

【问题讨论】:

  • 来自提供的链接:“它们只允许在函数和存储过程中。”
  • 您可以将脚本放入存储过程中,然后简单地调用该过程。

标签: mysql database if-statement


【解决方案1】:

我只是将我的 SQL 脚本包装在一个允许条件代码的过程中。如果您不想将这些语句放在一边,您可以在完成后放弃该过程。这是一个例子:

delimiter //

create procedure insert_games() 

begin

    set @platform_id := (select id from platform where name = 'Nintendo DS');

    -- Only insert rows if the platform was found
    if @platform_id is not null then 

        insert into game(name, platform_id) values('New Super Mario Bros', @platform_id);
        insert into game(name, platform_id) values('Mario Kart DS', @platform_id);

    end if;

end;

//

delimiter ;

-- Execute the procedure
call insert_games();

-- Drop the procedure
drop procedure insert_games;

如果您没有使用过过程,“delimiter”关键字可能需要一些解释。第一行将分隔符切换为“//”,以便我们可以在过程定义中包含分号,而 MySQL 不会尝试解释它们。创建过程后,我们将分隔符切换回“;”这样我们就可以像往常一样执行语句了。

【讨论】:

    【解决方案2】:

    在做了一些研究之后,我想我可能已经找到了解决这个问题的方法。我正在寻找一种方法来验证脚本是否已经针对目标数据库执行。这将主要用于我的数据库的版本控制。我创建了一个表来跟踪已执行的脚本,并希望我的脚本中有一些流程在执行前首先检查该表。虽然我还没有完全解决这个问题,但我已经创建了一个基本上可以满足我需要的简单脚本,我只需要根据变量的值将 DDL 包装到选择中。

    第 1 步 - 设置一个位变量来保存结果 第 2 步 - 如果找到结果,请选择并设置变量 第 3 步 - 对错误结果执行您需要执行的操作 第 4 步 - 对真实结果做你需要做的事情

    这是示例脚本

    设置@schemachangeid = 0;

    select @schemachangeid := 1 from SchemaChangeLog where scriptname = '1_create_tables.sql';

    select 'scriptalreadyran' from dual where @schemachangeid = 1;

    从 @schemachangeid = 0 的对偶中选择“scriptnotran”;

    我也认识到这是一个旧线程,但也许这会帮助那些试图在像我这样的存储过程之外做这种事情的人。

    【讨论】:

      猜你喜欢
      • 2011-01-01
      • 2011-01-30
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      • 2014-07-24
      • 2012-02-14
      相关资源
      最近更新 更多