Mysql 触发器语句不断给出语法错误
Mysql trigger statement keeps giving syntax error
当我尝试在 phpmyadmin 中执行此语句时,我不断收到错误消息。我是 运行 mysql 5.7
DELIMITER //
CREATE OR REPLACE TRIGGER update_counts_trigger AFTER INSERT OR UPDATE OR DELETE ON tickets
FOR EACH ROW
BEGIN
DECLARE V_uitvoeringId, V_ReserveringId varchar(50);
DECLARE V_tekoop, V_gereserveerd, V_wachtlijst int;
SET V_ReserveringId = NEW.reserveringId OR OLD.reserveringId;
SET V_uitvoeringId = ( SELECT uitvoeringId FROM reservering WHERE id=V_ReserveringId )
SET V_tekoop = (
SELECT count(*)
FROM tickets t
WHERE t.tekoop AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId);
SET V_gereserveerd = (
SELECT count(*)
FROM tickets t
WHERE NOT t.wachtlijst AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId);
SET V_wachtlijst = (
SELECT count(*) FROM tickets t WHERE t.wachtlijst AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId);
update uitvoering
set tekoop = V_tekoop,
gereserveerd = V_gereserveerd,
wachtlijst = V_wachtlijst,
vrije_plaatsen = aantal_plaatsen - V_gereserveerd + V_tekoop
WHERE id=V_uitvoeringId;
END //
DELIMITER ;
谁能看出哪里出了问题?
- 无法识别的语句类型。 (在位置 176 的“DECLARE”附近)
- 这种类型的子句之前已经过分析。 (在位置 398 的“SET”附近)
- 无法识别的语句类型。 (在位置 1192 的“END”附近)
还有其他语法错误导致了这些投诉。
- MySQL 中没有带触发器的
OR REPLACE
选项。触发器必须被删除然后重新创建。
- 没有
OR
操作,只有一个,这意味着即使定义可能相同,您也必须创建 3 个触发器。但是,您似乎只需要一个 AFTER UPDATE
动作? ...因为 AFTER INSERT
没有 OLD
参考,并且 AFTER DELETE
没有 NEW
参考。
- 通过这两项,在
SELECT uitvoeringId
的查询之后还缺少 ;
。
将所有这些放在一起,变成:
DELIMITER //
CREATE TRIGGER update_counts_trigger AFTER UPDATE ON tickets
FOR EACH ROW
BEGIN
DECLARE V_uitvoeringId, V_ReserveringId varchar(50);
DECLARE V_tekoop, V_gereserveerd, V_wachtlijst int;
SET V_ReserveringId = NEW.reserveringId OR OLD.reserveringId;
SET V_uitvoeringId = ( SELECT uitvoeringId FROM reservering WHERE id=V_ReserveringId );
SET V_tekoop = (
SELECT count(*)
FROM tickets t
WHERE t.tekoop AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId);
SET V_gereserveerd = (
SELECT count(*)
FROM tickets t
WHERE NOT t.wachtlijst AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId);
SET V_wachtlijst = (
SELECT count(*) FROM tickets t WHERE t.wachtlijst AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId);
update uitvoering
set tekoop = V_tekoop,
gereserveerd = V_gereserveerd,
wachtlijst = V_wachtlijst,
vrije_plaatsen = aantal_plaatsen - V_gereserveerd + V_tekoop
WHERE id=V_uitvoeringId;
END //
DELIMITER ;
然后在 phpMyAdmin 中使用:
然后执行完SQL:
然后检查触发器选项卡:
...并在触发器处单击 Edit
显示定义:
当我尝试在 phpmyadmin 中执行此语句时,我不断收到错误消息。我是 运行 mysql 5.7
DELIMITER //
CREATE OR REPLACE TRIGGER update_counts_trigger AFTER INSERT OR UPDATE OR DELETE ON tickets
FOR EACH ROW
BEGIN
DECLARE V_uitvoeringId, V_ReserveringId varchar(50);
DECLARE V_tekoop, V_gereserveerd, V_wachtlijst int;
SET V_ReserveringId = NEW.reserveringId OR OLD.reserveringId;
SET V_uitvoeringId = ( SELECT uitvoeringId FROM reservering WHERE id=V_ReserveringId )
SET V_tekoop = (
SELECT count(*)
FROM tickets t
WHERE t.tekoop AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId);
SET V_gereserveerd = (
SELECT count(*)
FROM tickets t
WHERE NOT t.wachtlijst AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId);
SET V_wachtlijst = (
SELECT count(*) FROM tickets t WHERE t.wachtlijst AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId);
update uitvoering
set tekoop = V_tekoop,
gereserveerd = V_gereserveerd,
wachtlijst = V_wachtlijst,
vrije_plaatsen = aantal_plaatsen - V_gereserveerd + V_tekoop
WHERE id=V_uitvoeringId;
END //
DELIMITER ;
谁能看出哪里出了问题?
- 无法识别的语句类型。 (在位置 176 的“DECLARE”附近)
- 这种类型的子句之前已经过分析。 (在位置 398 的“SET”附近)
- 无法识别的语句类型。 (在位置 1192 的“END”附近)
还有其他语法错误导致了这些投诉。
- MySQL 中没有带触发器的
OR REPLACE
选项。触发器必须被删除然后重新创建。 - 没有
OR
操作,只有一个,这意味着即使定义可能相同,您也必须创建 3 个触发器。但是,您似乎只需要一个AFTER UPDATE
动作? ...因为AFTER INSERT
没有OLD
参考,并且AFTER DELETE
没有NEW
参考。 - 通过这两项,在
SELECT uitvoeringId
的查询之后还缺少;
。
将所有这些放在一起,变成:
DELIMITER //
CREATE TRIGGER update_counts_trigger AFTER UPDATE ON tickets
FOR EACH ROW
BEGIN
DECLARE V_uitvoeringId, V_ReserveringId varchar(50);
DECLARE V_tekoop, V_gereserveerd, V_wachtlijst int;
SET V_ReserveringId = NEW.reserveringId OR OLD.reserveringId;
SET V_uitvoeringId = ( SELECT uitvoeringId FROM reservering WHERE id=V_ReserveringId );
SET V_tekoop = (
SELECT count(*)
FROM tickets t
WHERE t.tekoop AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId);
SET V_gereserveerd = (
SELECT count(*)
FROM tickets t
WHERE NOT t.wachtlijst AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId);
SET V_wachtlijst = (
SELECT count(*) FROM tickets t WHERE t.wachtlijst AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId);
update uitvoering
set tekoop = V_tekoop,
gereserveerd = V_gereserveerd,
wachtlijst = V_wachtlijst,
vrije_plaatsen = aantal_plaatsen - V_gereserveerd + V_tekoop
WHERE id=V_uitvoeringId;
END //
DELIMITER ;
然后在 phpMyAdmin 中使用:
然后执行完SQL:
然后检查触发器选项卡:
...并在触发器处单击 Edit
显示定义: