我在创建触发器时遇到一些问题,因为我必须声明一些变量,然后将它们中的一些设置为0,这样它们就会在循环中开始增加它们的值,具体取决于条件。 无论如何,我会粘贴代码,以及它抛出的错误,希望有人会告诉我我做错了什么。感谢。
CREATE TRIGGER update_request AFTER UPDATE ON medical_tests
FOR EACH ROW
BEGIN
DECLARE y INT, x0 INT, x3 INT, counting INT
SET y=0, x0=0, x3=0,
counting = count(SELECT * FROM medical_tests WHERE medical_tests.request_id = UPDATED.request_id)
WHILE (y<counting)
BEGIN
SET y=y+1
IF (medical_tests.status=1)
BEGIN
SET x0=x0+1
END
ELSEIF (medical_tests.status=3)
BEGIN
SET x3=x3+1
END
END IF
END WHILE
IF (x0>0 AND x0<counting)
BEGIN
UPDATE requests SET status=2 WHERE requests.id=UPDATED.request_id
END
ELSEIF (x3=counting)
BEGIN
UPDATE requests SET status=3 WHERE requests.id=UPDATED.request_id
END
ENDIF
END
它会抛出以下错误: #1064 - 您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以获得正确的语法,以便在&#39;附近使用。 x0 INT,x3 INT,计数INT SET y = 0,x0 = 0,x3 = 0,计数=计数(SELECT * FROM m&#39;第3行。
上次我写了一个触发器,我在MySQL Server中做了它,语法有点不同。也许我只是需要创建一个程序并改为调用它。如果有人可以提供帮助,我会很感激。
答案 0 :(得分:2)
首先要做的事情。要正确 declare 相同类型的变量和MySQL中相同的初始值更改
DECLARE y INT, x0 INT, x3 INT, counting INT
到
DECLARE y, x0, x3, counting INT DEFAULT 0;
这声明了INT
类型的四个变量,默认值为0
。
但这只是一个开始。您的代码还有其他一些问题:
;
终止每个语句,其中包括IF ... END IF;
,WHILE ... END WHILE;
等。NEW
关键字而不是UPDATED
。SET
块中包装每个BEGIN...END
语句。它只是增加了混乱。(medical_tests.status=1)
随意访问while循环中的列值。如果您打算引用正在更新的行的status
列,则需要再次使用特殊关键字NEW
或OLD
。如果您想要遍历其他结果集,那么您应该使用游标或在SELECT
语句中执行此操作。