MySQL触发器检查行字段是不是存在

Posted

技术标签:

【中文标题】MySQL触发器检查行字段是不是存在【英文标题】:MySQL Trigger Check if Row Field ExistsMySQL触发器检查行字段是否存在 【发布时间】:2017-10-26 18:41:42 【问题描述】:

我在表上创建了一个触发器,如下所示:

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;

【问题讨论】:

您能否详细说明您想要实现的目标?因为现在你的问题很模糊。 我更新了更多解释 你能发布确切的错误信息吗? ERROR 1054 (42S22): Unknown column 'size' in 'field list' 即使该字段存在于表中 没关系找到答案。我假设引用 size 会自动获取旧值,但我需要引用 OLD.size。错误信息很糟糕 【参考方案1】:

该错误与 UPDATE 语句中引用的列无关。

最大的问题是触发器正文中对size 的非限定引用。如果目的是检测分配给size 的值的变化,我们应该将NEW.size 的值与OLD.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 允许空的 BEGIN END; 块,因此我们可以将其用作空操作。

尚不清楚您要达到的目标。

【讨论】:

为了简单起见,我将块留空,因为我知道问题不存在。我正在尝试检测特定列中的更改。你能解释一下&lt;=&gt; &lt;=&gt; (spaceship) 运算符执行 null 安全比较,并且将返回 TRUE 或 FALSE 以与 NULL 值进行比较,这与常规的 =&lt;&gt; 不同返回 NULL 以与 NULL 进行比较的比较运算符。表达式a &lt;=&gt; b 等价于表达式IF(a=b OR (a IS NULL AND b IS NULL),1,0)。在触发器中使用,它是检测列值更改的便捷简写,包括对 NULL 的更改。

以上是关于MySQL触发器检查行字段是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

如何检查在mysql中存储多个值的变量中是不是存在特定值?

MySQL #1422 存储函数或触发器中不允许显式或隐式提交

Mysql,检查行是不是存在,如果它确实获取值,如果不插入

检查是不是从 MySQL 触发器中的 SELECT INTO 设置了变量

MySQL - 在第 1 行附近创建触发器错误 1064

mysql触发器(trigger)