2015-12-25 38 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