BEFORE INSERT触发器的不可预知的行为

时间:2013-12-23 16:40:53

标签: mysql triggers

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

我假设如果没有使用SELECT INTO放置任何行,则此触发器失败,这就是我想要的,因此列上具有default 0默认值的表就会出现。

但版本似乎没有重复。这里看起来像什么问题?

表格布局的形式如下:

`id - auto incr主键

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

1 个答案:

答案 0 :(得分:2)

如果没有记录,则查询返回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