Mysql触发器:检查值实际上是在插入触发器之前设置的

Mysql触发器:检查值实际上是在插入触发器之前设置的,mysql,triggers,beforeupdate,Mysql,Triggers,Beforeupdate,假设我有一张桌子 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) ); 在插入触发器之前: DROP TRIGGER IF EXISTS `test_update`; DELIMITER // CREATE TRI

假设我有一张桌子

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)
);
在插入触发器之前:

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;

如何正确检测未设置的Foo?

您已使用以下内容创建了表:

Foo tinyint(1) unsigned NOT NULL DEFAULT 0,
因此,由于
[tinyint][1]:1字节,-128到+127/0到255(无符号)

快速测试:

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

触发器是关联
Bar
值,而不是
FOO
值。你确定这里发生了不应该发生的事情吗?谢谢你的评论。是的,我肯定
Foo
是一个标志,update语句中缺少该标志是以另一种方式处理
Bar
列的条件(在简化的示例中,只需重写为“Hello world”)。据我所知,
Foo
的新值和旧值应该总是相同的。@TimBiegeleisen,似乎是对的。Mysql在更新前触发器中填充
NEW
,并带有更新的潜在结果,而不是实际传入的数据。您可能希望更新您的问题,并显示几个
update
语句和您在表中看到的结果。我已将Foo更改为tinyint signed default null,结果相同。。。实际上我不需要Foo为null。我需要获取列值,并将其传递到更新查询中。