Mysql 插入前触发器的不可预测行为

Mysql 插入前触发器的不可预测行为,mysql,triggers,Mysql,Triggers,我正在使用MySQL 5.1编写一个Before Insert触发器。为此,我想检查收据编号列,如果收据编号已在表中,则增加版本编号 我假设如果使用SELECT-INTO未放置任何行,则此触发器将失败,这正是我想要的,因此列上具有default 0默认值的表将通过 但是版本号似乎被复制了。这里的问题是什么 表格布局的形式如下: `id-自动递增主键 收据号-唯一约束 版本号-唯一约束| 其他不相关列` CREATE TRIGGER `increment_version` BEFORE INSER

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

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

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

表格布局的形式如下:

`id-自动递增主键

收据号-唯一约束

版本号-唯一约束|

其他不相关列`

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

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

请参阅此演示:

您应该检查版本是否为空,然后如果为空则结束;谢谢你的回复。假设触发器抛出错误,并在没有行的情况下退出。很高兴知道空值。