2015-12-25 42 views
1

假設我有一個表。Mysql觸發器:檢查值實際上是在插入觸發器之前設置的

CREATE TABLE IF NOT EXISTS Test (
    Id int(11) NOT NULL AUTO_INCREMENT, 
    Foo tinyint(1) unsigned NOT NULL DEFAULT 0, 
    Bar varchar(255) NOT NULL, 
    PRIMARY KEY (Id) 
); 

和INSERT觸發器之前:

DROP TRIGGER IF EXISTS `test_update`; 
DELIMITER // 
CREATE TRIGGER `test_update` BEFORE UPDATE ON `Test` 
FOR EACH ROW BEGIN 
    IF NEW.Foo IS NULL THEN 
    -- do something 
    END IF; 
END 
// 
DELIMITER ; 

通過觸發我是否Foo列實際上是傳遞到update語句。否則我會做點什麼。

我的查詢:

UPDATE Test 
SET Bar = '23' 
WHERE Id = 1; 

如何正確檢測美孚沒有設置?

+0

您的觸發器asssigning 「酒吧」值,而不是「FOO」值。你確定這裏發生的事情不應該發生嗎? –

+0

感謝您的評論。是,我確定。 'Foo'是一個標誌,在更新語句中缺少的是以另一種方式處理'Bar'列的條件(在簡單的例子中 - 只需重寫爲'Hello world') – userlond

+0

從我所知道的,新舊值對於'Foo'應該總是一樣的。 –

回答

0

您已經創建表:

Foo tinyint(1) unsigned NOT NULL DEFAULT 0, 

因此,你將永遠不會在 '富' 得到NULL,因爲[tinyint][1]: 1 byte, -128 to +127/0 to 255 (unsigned)

只是快速測試:

mysql> INSERT INTO `Test` (`Id`, `Foo`, `Bar`) VALUES (1, 'ttt', 'La-la-la'); 
ERROR 1366 (HY000): Incorrect integer value: 'ttt' for column 'Foo' at row 1 
+0

我已經將Foo更改爲tinyint簽名的默認空值,結果是一樣的... 其實我不需要Foo爲空。我需要獲得列值,傳入更新查詢。 – userlond