2013-02-09 71 views
0

我有一個觸發器:QUERY「IF NOT EXISTS」..​​..爲什麼它不起作用?

CREATE TRIGGER BEFORE_DELETE_ON_SENTIERO__HA__TAPPA 
BEFORE DELETE ON SENTIERO__HA__TAPPA 
FOR EACH ROW 
BEGIN 

DECLARE temp_prima_tappa INTEGER; 
DECLARE temp_ultima_tappa INTEGER; 

-- NOW THIS QUERY WILL FAIL; it checks if the record that has to be deleted is in the table 
IF NOT EXISTS (SELECT * 
       FROM SENTIERO__HA__TAPPA as sht 
       WHERE OLD.IDsentiero=sht.IDsentiero and OLD.IDtappa=sht.IDtappa) THEN 

         SIGNAL SQLSTATE '45000' 
         SET MESSAGE_TEXT = 'DELETE: La tappa indicata non è nel sentiero; impossibile elimnarla'; 

END IF; 

IDsentiero和IDtappa是其相對錶的PKIDsentiero爲的Sentiero,IDtappa爲TAPPA。

問題是,DELETE QUERY不回覆我的錯誤消息;只需即可運行DELETE QUERY,但它不能刪除任何東西,因爲該表中不存在該記錄。

問題是,查詢..我敢肯定,但我找不到錯誤。

+0

你的第二張桌子在哪? – TheDeadLike 2013-02-09 19:08:43

+1

Exexse me。它是一個刪除觸發器(行觸發器)...我認爲OLD.column是關於刪除記錄的列...你同意嗎? – FrancescoN 2013-02-09 20:23:30

回答

0

像這樣的東西應該工作:

declare recsexist int; 
set recsexist = 0; 

SELECT 1 INTO recsexist 
FROM SENTIERO__HA__TAPPA as sht 
WHERE OLD.IDsentiero=sht.IDsentiero and OLD.IDtappa=sht.IDtappa; 

IF (recsexist > 0) THEN 
    ... 

END IF; 
+1

但是爲什麼我的版本不正確?如果不存在應該是正確的,因爲如果沒有一條記錄滿足該條件(因此不存在該記錄),則應該提出該信號...你認爲怎麼樣? – FrancescoN 2013-02-09 20:25:50

+0

@ Jimmy5nomana - 只是在MySQL中不能這樣工作 - 例如,上面的代碼在MSSQL中運行良好。祝你好運。 – sgeddes 2013-02-09 20:27:56

+0

嘿嘿,我知道它不工作在MySQL ^^所以你認爲這只是一個DBMS的問題,好吧,至少它不是我的錯 – FrancescoN 2013-02-09 20:30:44

0

刪除觸發器只能在實際刪除的行運行,這樣觸發器運行的時間,該行必須存在。您不能使用觸發器來查找無效的刪除語句。

+0

請問,BEFORE和AFTER觸發器之間的區別是什麼?你在告訴我,它不存在舊記錄嗎? – FrancescoN 2013-02-09 20:42:01

+0

不,它總是存在於觸發器之前,並且在觸發器之後從不存在,因爲這是觸發觸發器的條件。 – Neil 2013-02-09 20:59:41

+0

好吧,但在DELETE觸發器中沒有NEW ...因此在BEFORE DELETE中,由於DELETE觸發器,會存在指向列的OLD語句(我正在談論行觸發器) – FrancescoN 2013-02-09 21:04:45