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$$
THEN
和 END IF
之间没有任何内容是无效的。我们必须在那里做点什么。 mysql 允许空的 BEGIN
END;
块,因此我们可以将其用作空操作。
尚不清楚您要达到的目标。
【讨论】:
为了简单起见,我将块留空,因为我知道问题不存在。我正在尝试检测特定列中的更改。你能解释一下<=>
<=>
(spaceship) 运算符执行 null 安全比较,并且将返回 TRUE 或 FALSE 以与 NULL 值进行比较,这与常规的 =
、<
、>
不同返回 NULL 以与 NULL 进行比较的比较运算符。表达式a <=> b
等价于表达式IF(a=b OR (a IS NULL AND b IS NULL),1,0)
。在触发器中使用,它是检测列值更改的便捷简写,包括对 NULL 的更改。以上是关于MySQL触发器检查行字段是不是存在的主要内容,如果未能解决你的问题,请参考以下文章
MySQL #1422 存储函数或触发器中不允许显式或隐式提交