MySQL中的断言

时间:2010-08-24 19:14:56

标签: sql mysql assert

我有一个针对大型数据库运行的SQL脚本。我想在开始时提出一些简单的查询,就像进行健全检查一样。

有没有办法在MySQL中编写断言?或者任何类型的“选择......,如果它与此值不匹配,则中止整个脚本”?

4 个答案:

答案 0 :(得分:5)

一些疯狂的代码。要点是:SET可能会引发mysql变量的错误。

例如。

 SET @value = 0;
 SET SESSION sql_mode = if(@value, @@SESSION.sql_mode, 'something wrong uphere'); 

输出ERROR 1231 (42000): Variable 'sql_mode' can't be set to the value of 'something wrong uphere'和执行是否会停止。

这种方法不是语义的,但它有效。

答案 1 :(得分:3)

您可以将整个脚本放在if语句中,具体取决于您需要检查的值,这是一个示例:

DECLARE @value int
SET @value = (SELECT COUNT(*) FROM dbo)

IF @value >0
BEGIN
 --Do Stuff Here
END

答案 2 :(得分:1)

您也可以通过存储过程/函数执行此操作,如下例所示:

CREATE FUNCTION `RunProcess`() RETURNS INT(11)
runProcess:BEGIN

DECLARE check_value INT;
DECLARE error_code INT;

SELECT COUNT(*) FROM dbo INTO check_value;

IF check_value = 0 THEN set error_code = 666;
    LEAVE runProcess;
    RETURN error_code;
END IF;

...
...
END;

答案 3 :(得分:0)

一种解决方法是在断言失败的情况下故意使插入失败。这不是很漂亮,但是很简单并且可以正常工作。

假设表1包含columnA和columnB。您想在表中插入值('any', 'thing'),但仅在这些值满足某些条件的情况下。

然后执行以下操作:

SELECT 'any', 'thing' INTO @setA, @setB FROM DUAL WHERE ( your conditions...);
INSERT INTO Table1 (columnA, columnB) VALUES (@setA, @setB);

“ any”和“ thing”值显然会在运行时插入查询中。 如果您将Table1设置为仅接受A或B列中的非空值,则在条件失败时将失败。

如果您希望值不同,那么这是一个非常简单的荒谬示例(显然可以通过其他方式实现,这只是一个示例:-))。

SELECT 'any', 'thing' INTO @setA, @setB FROM DUAL WHERE ( 'a'!='b');
INSERT INTO Table1 (columnA, columnB) VALUES (@setA, @setB);

测试条件不必在您要插入的值上:

SELECT 'any', 'thing' INTO @setA, @setB FROM DUAL WHERE ( 'another' IS NOT NULL);
INSERT INTO Table1 (columnA, columnB) VALUES (@setA, @setB);

如果您的目标不是执行插入操作,则可以将相同的逻辑应用于不同的事务类型,其想法是更改变量,使变量使查询失败。

或者您可以为此目的创建一个具有非null列的虚拟表,并始终将您的断言结果插入虚拟表的第一行。不漂亮,但是可以用:-)