如果DELETE TRIGGER中的声明 - 失败

时间:2014-10-02 22:13:21

标签: mysql sql if-statement triggers

所以我用If语句尝试了很多不同的东西,而我似乎无法弄清楚如何做到这一点。

如果重复出现,我不想让触发器删除ID最低的行。 通过重复我的意思是数字和用户名在两行中是相同的。

例如

ROW1: ID: 1 , Nr: 1 , UN: MVJ and 

Row2: ID: 2 , Nr: 1 , UN: MVJ

这些是经常性的,但如果'Nr''UN'不同,则不会。

所以这是我到目前为止的尝试。

CREATE TRIGGER no_double_reservations 
AFTER INSERT ON tilmeldte 
FOR EACH ROW 
WHERE
'SELECT COUNT(*) from tilmeldte WHERE (kursus_nr, username) IN ( SELECT kursus_nr, username FROM tilmeldte GROUP BY kursus_nr, username HAVING count(*) = 2 )' = '2'

DELETE from tilmeldte Where tilmeldingsid = 
'Select min(`tilmeldingsid`) from tilmeldte WHERE (kursus_nr, username) IN ( SELECT min(kursus_nr), username FROM tilmeldte GROUP BY kursus_nr, username HAVING count(*) = 2 )' 

END;

找到了正确的语法,但发现在SQL中移动是不可能的。 您无法从选择要删除的行的表中删除行。

正确的语法是:

DELIMITER !!
CREATE TRIGGER no_double_reservations 
AFTER INSERT ON tilmeldte 
FOR EACH ROW BEGIN
IF(
SELECT COUNT(*) from tilmeldte WHERE (kursus_nr, username) IN ( SELECT kursus_nr, username FROM tilmeldte GROUP BY kursus_nr, username HAVING count(*) = 2 ) = 2)
THEN
DELETE from tilmeldte Where tilmeldingsid = (Select min(`tilmeldingsid`) from tilmeldte WHERE (kursus_nr, username) IN ( SELECT min(kursus_nr), username FROM tilmeldte GROUP BY kursus_nr, username HAVING count(*) = 2 ));
END IF;

END!!

DELIMITER ;

1 个答案:

答案 0 :(得分:0)

您的触发器存在一些语法错误,但这些错误有点不重要,因为您尝试做的事情是不可能的:

  

存储的函数或触发器不能通过调用函数或触发器的语句修改已经使用(用于读取或写入)的表。

http://dev.mysql.com/doc/refman/5.6/en/stored-program-restrictions.html

MySQL中的触发器无法修改定义触发器的表中的其他行。这将开启无限触发递归的可能性,例如,行A上的触发器修改行B,它触发修改行A的触发器,触发修改行B的触发器,...