我有一个针对大型数据库运行的SQL脚本。我想在开始时提出一些简单的查询,就像进行健全检查一样。
有没有办法在MySQL中编写断言?或者任何类型的“选择......,如果它与此值不匹配,则中止整个脚本”?
答案 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列的虚拟表,并始终将您的断言结果插入虚拟表的第一行。不漂亮,但是可以用:-)