21

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

在这种情况下有没有好的方法来强制失败?现在的情况是,当插入尝试使用 null 时,更新将失败,但即使这样也不会终止脚本本身。理想情况下,一旦遇到问题,它就会失败并终止。

4

7 回答 7

16

我遇到了同样的问题,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 客户端。

于 2009-08-14T00:32:02.887 回答
8

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

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

如果我正确理解您的问题,MySQL Administrator会满足您的需求。如果您设置 MySQL 连接并连接到数据库,则“工具”菜单中有两个可用的工具。正常的 MySQL 控制台在那里,但您也有 MySQL 查询浏览器。

如果您打开查询浏览器,您将获得一个不错的 MySQL 数据库 GUI 视图。File -> Open Script 打开你的 SQL 脚本,然后使用 Execute 按钮。

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

一旦我发现并尝试了管理员,我几乎立即放弃了 MySQL 控制台。

于 2009-04-26T07:45:25.637 回答
8

MySQL Workbench 现在取代了 MySQL Administrator。

使用“切换语句失败后是否应继续执行 SQL 脚本”

切换语句失败后是否应继续执行 SQL 脚本

于 2012-03-28T21:19:23.173 回答
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);

如果当前版本是 1327,您会看到类似这样的内容:

成功:1327 > 1328

再次运行它,您将看到:

失败 - 版本是 1328

希望这对某人有用。

于 2009-09-16T11:01:04.540 回答
1

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

于 2009-04-24T02:35:52.183 回答
1

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

kill connection_id();
于 2019-03-27T10:11:25.247 回答
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 );

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

于 2009-11-20T06:21:35.027 回答