我需要为MySQL编写设置脚本(通常使用mysql控制台中的'source [file]'运行),这部分依赖于现有数据,并且环境存在差异,这意味着有时脚本会失败。一个常见的情况是带有select(用于定位id)的'SET'语句无法找到任何内容; console将value设置为NULL。在这种情况下,我希望脚本失败;我听说这会通过引发错误(与其他DB)完成。然而,似乎MySQL没有办法做到这一点。
在这种情况下是否有很好的方法可以强迫失败?就像现在一样,当insert尝试使用null时,更新将失败,但即使这样也不会终止脚本本身。理想情况下,只要遇到问题,它就会失败并终止。
答案 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脚本'
答案 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();