【问题标题】:Unpredictable behaviour of BEFORE INSERT triggerBEFORE INSERT 触发器的不可预测的行为
【发布时间】:2013-12-23 16:40:52
【问题描述】:

我正在使用 MySQL 5.1 编写一个 Before Insert 触发器。为此,我想检查receipt_no 列,如果receipt_no 已经在表中,则增加version_no

我假设如果没有使用SELECT INTO 放置行,则此触发器将失败,这正是我想要的,因此列上具有default 0 默认值的表通过。

但是版本号似乎被重复了。这里的问题是什么?

表格布局的形式为:

`id - 自动增加主键

receipt_no - 唯一约束 |

version_no - 唯一约束 |

其他不相关的列`

CREATE TRIGGER `increment_version` BEFORE INSERT ON `my_table` FOR EACH ROW BEGIN

       DECLARE version INTEGER;

       SELECT version_no INTO version FROM my_table WHERE receipt_no = NEW.receipt_no LIMIT 1;

       SET NEW.version_no = version + 1;

END

【问题讨论】:

  • 你应该检查一下 IF version IS NOT NULL THEN END IF ;

标签: mysql triggers


【解决方案1】:

如果没有记录,则查询返回 null 到 version,NULL + 1 给出 NULL。
您需要检查version 是否为空。
还要在查询中使用 MAX,因为您需要检索最大的版本号。

CREATE TRIGGER `increment_version` 
BEFORE INSERT ON `my_table` FOR EACH ROW 
BEGIN
   DECLARE version INTEGER;

   SELECT max(version_no) INTO version FROM my_table 
   WHERE receipt_no = NEW.receipt_no 
   ;
   IF version IS NOT NULL THEN
     SET NEW.version_no = version + 1;
   END IF;
END

查看此演示:http://www.sqlfiddle.com/#!2/b82c34/1

【讨论】:

  • 感谢您的回复。假设触发器抛出错误并在没有行的情况下退出。很高兴了解 null。
猜你喜欢
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多