中止MySQL脚本执行的方法(可能会引发错误)?

时间:2009-04-21 18:15:38

标签: sql mysql exception fast-fail

我需要为MySQL编写设置脚本(通常使用mysql控制台中的'source [file]'运行),这部分依赖于现有数据,并且环境存在差异,这意味着有时脚本会失败。一个常见的情况是带有select(用于定位id)的'SET'语句无法找到任何内容; console将value设置为NULL。在这种情况下,我希望脚本失败;我听说这会通过引发错误(与其他DB)完成。然而,似乎MySQL没有办法做到这一点。

在这种情况下是否有很好的方法可以强迫失败?就像现在一样,当insert尝试使用null时,更新将失败,但即使这样也不会终止脚本本身。理想情况下,只要遇到问题,它就会失败并终止。

7 个答案:

答案 0 :(得分:14)

我遇到了同样的问题,GUI不是我的选择。这就是我解决它的方法:

    DELIMITER $$

    DROP FUNCTION IF EXISTS sfKillConnection $$

    CREATE FUNCTION sfKillConnection() RETURNS INT
    BEGIN

        SELECT connection_id() into @connectionId;
        KILL @connectionId;
        RETURN @connectionId;
    END $$


    DELIMITER ;

这是一个函数而不是一个过程,因此可以在这样的脚本中调用它:

select if(@error, sfKillConnection(), 0);

您可能需要使用--disable-reconnect选项启动mysql客户端。

答案 1 :(得分:8)

我认为您遇到的是MySQL控制台的限制。给定一个语句列表,MySQL控制台执行每个语句,而不管生成的任何错误。即使你实现了之前评论中提到的一些错误提示建议,当遇到这样的错误时,MySQL控制台也不会停止执行。

我假设您没有资源将脚本语言应用于可以为您执行SQL并处理错误的问题。我想在这种情况下,你只需要一个比MySQL控制台更强大的工具。

如果我正确理解您的问题,

MySQL Administrator可以满足您的需求。如果设置MySQL连接并连接到数据库,则“工具”菜单中提供了两个工具。普通的MySQL控制台就在那里,但你也有MySQL查询浏览器。

如果打开查询浏览器,您将获得一个体面的MySQL数据库GUI视图。档案 - >打开脚本以打开SQL脚本,然后使用“执行”按钮。

你得到一个很好的进度条,更重要的是从它的声音,如果查询失败,脚本执行停止并突出显示失败的查询。您可以选择跳过它并继续,甚至手动修改数据,然后从脚本的其他位置启动。

一旦我发现并尝试使用Administrator,我几乎立即放弃了MySQL控制台。

答案 2 :(得分:6)

MySQL Workbench现在取代了MySQL Administrator。

使用'切换是否应在失败的语句后继续执行SQL脚本'

Toggle whether execution of SQL script should continue after failed statements

答案 3 :(得分:2)

看起来KILL QUERY应该做你需要的。

答案 4 :(得分:2)

只有在某个版本到位的情况下,才能执行升级命令。

这很难看但是我可以为mysql 5提出建议。

DELIMITER $$  
DROP FUNCTION IF EXISTS `Upgrade_Build`$$    
CREATE FUNCTION `Upgrade_Build`(bversion INT) RETURNS varchar(30)
BEGIN 
  IF bversion = (SELECT MIN(`db_version`) FROM `system`) THEN 
    UPDATE `pages`
      SET `component_parameters` =
        REPLACE(`component_parameters`,'folderviewer_','folder_viewer.'); 
    UPDATE `system`
      SET `db_version` = bversion+1;
    return CONCAT('Success: ',bversion,' > ',bversion+1); 
  ELSE 
    return CONCAT('Failed - Version is ',(SELECT MIN(`db_version`) FROM `system`)); 
  END IF; 
END$$
DELIMITER ;

要使用它,请执行以下操作:

SELECT Upgrade_Build(1327);

如果当前版本为WAS 1327:

,您会看到类似的内容

成功:1327> 1328

第二次运行它,你会看到:

失败 - 版本为1328

希望这对某人有用。

答案 5 :(得分:0)

这是一个低前额的方法:

我需要确保@search_admin_realname对应profiles表中的记录;如果没有,我想中止我的剧本。

所以我这样做了:

select @search_admin_id:= userid
from profiles
where realname=@search_admin_realname
;
# test that @search_admin_id is not null; 
# if it is, then the insert will fail and script will abort.
create temporary table t_search_admin_id ( search_admin_id mediumint( 9 ) not null );
insert into t_search_admin_id ( search_admin_id ) values ( @search_admin_id );

唯一的缺点是我无法真正自定义错误消息:(

答案 6 :(得分:0)

对于仍在寻找的任何人,您都可以要求MySQL终止连接,甚至是当前的连接:

kill connection_id();