2009-04-21 26 views
16

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

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

+1

似乎是重复的:http://stackoverflow.com/questions/465727/raise-error-within-mysql-function/466826 – 2009-04-23 20:34:31

+0

嗯。它是相关的,但我不确定它是一个dup,因为我从mysql控制台运行sql,并没有存储过程。但是,也许我误解了这里的差异(控制台只是基本上运行与存储过程一样的方式执行?)。 非常感谢您的链接。 – StaxMan 2009-04-24 18:17:15

+1

可能有新的选项可以进来MySQL 6请参阅http://bugs.mysql.com/bug.php?id=35634 – KCD 2012-03-28 21:23:59

回答

7

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

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

MySQL Administrator做你所需要的,如果我正确地理解你的问题。如果你设置你的MySQL连接并连接到数据库,你可以在工具菜单中找到两个工具。正常的MySQL控制台在那里,但你也有MySQL查询浏览器。

如果你打开查询浏览器,你会得到一个像样的你的MySQL数据库的GUI视图。文件 - >打开脚本打开你的SQL脚本,然后使用执行按钮。

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

我几乎立即发现了并且尝试了管理员后就放弃了MySQL控制台。

13

我有同样的问题,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); 

你可能需要与启动MySQL客户端--disable-reconnect选项。

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

希望这对某人有用。

0

这里有一个低额的方法:

我需要确保@search_admin_realname对应于profiles表中的记录;如果不是,我想放弃我的剧本。

所以我这样做:

select @search_admin_id:= userid 
from profiles 
where [email protected]_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); 

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

5

MySQL工作台现在取代MySQL管理

使用“触发。在失败语句后是否应继续执行SQL脚本'

Toggle whether execution of SQL script should continue after failed statements