2017-05-26 32 views
1

我創建一個表上的觸發如下:MySQL的觸發檢查行字段存在

delimiter // 
CREATE TRIGGER tb_ins BEFORE UPDATE ON tb 
FOR EACH ROW 
BEGIN 
    IF (NEW.size <> size) THEN 

    END IF; 
END;// 

的問題是,個別更新比size其他任何領域給了我,沒​​有這樣的領域發現錯誤。

例如:

UPDATE tb SET color = 'red' WHERE id = 1; 

給我一個錯誤,沒有現場發現,因爲更新不包含的觸發需要的size場。

我需要知道是否有方法檢查我的觸發器功能中是否存在特定的ROW字段。這如何實現?

我需要的東西相當於:

IF EXISTS(ROW.size) THEN 

END IF; 
+1

你能詳細說說你想達到什麼嗎?因爲現在你的問題非常模糊。 – peterm

+0

我更新了更多解釋 – user2914191

+0

你能發佈確切的錯誤信息嗎? – peterm

回答

1

的錯誤是不相關的UPDATE語句引用的列。

最大的問題是在觸發器主體中對size的無保留引用。如果意圖檢測分配給size的值的變化,我們應該比較NEW.sizeOLD.size的值。


DELIMITER $$ 

DROP TRIGGER IF EXISTS tb_ins $$ 

CREATE TRIGGER tb_ins 
BEFORE UPDATE ON tb 
FOR EACH ROW 
BEGIN 
    IF NOT (NEW.size <=> OLD.size) THEN 
     -- value of size column has been modified 
     BEGIN END; 
    END IF; 
END$$ 

這不是有效的有THENEND IF之間沒有任何東西。我們必須在那裏有東西。 MySQL容忍一個空的塊,所以我們可以使用它作爲一個空操作。

目前尚不清楚你試圖實現什麼。

+0

爲了簡單起見,我將塊留空,因爲我知道問題不在那裏。我正在嘗試檢測特定列中的更改。你能解釋一下嗎?'<=>' – user2914191

+1

'<=>'(太空飛船)操作符執行空安全比較,並且與NULL值比較將返回TRUE或FALSE,與返回NULL的常規'=','<', '>'比較運算符不同用於與NULL進行比較。表達式'a <=> b'等同於表達式'IF(a = b OR(a IS NULL AND b IS NULL),1,0)'。在觸發器中使用時,它便於檢測對列值的更改,包括對NULL和NULL的更改。 – spencer7593