2014-10-02 53 views
0

所以我用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

爲什麼你的查詢周圍有單引號? – 2014-10-02 22:28:30

回答

0

你的觸發器有一些語法錯誤,但那些不是很重要,因爲你正在嘗試做的是不可能的:

存儲函數或觸發器無法修改已調用函數或觸發器的語句(用於讀取或寫入)的表。

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

觸發器在MySQL不能在表中修改其他行觸發器抵靠限定。這將爲無限的觸發遞歸提供可能性,例如行A上的觸發器修改行B,該行觸發修改行A的觸發器,該觸發器觸發修改行B的觸發器...

+0

謝謝你的回答,Michael。 當我得到正確的語法後,我發現我自己了 你知道另一種製作觸發器的方法,可以防止重複使用行,例如更新而不是刪除嗎? – MadsVJ 2014-10-16 10:38:06