MySQL触发器:在插入之前将记录与先前的记录进行比较

Posted

技术标签:

【中文标题】MySQL触发器:在插入之前将记录与先前的记录进行比较【英文标题】:MySQL Trigger: compare record with previous record before insert 【发布时间】:2012-09-12 05:02:37 【问题描述】:

当我在 db 中插入数据时,我必须将当前记录与前一个记录进行比较。如果需要,需要修改当前记录的一些值。

我已经尝试了一些类似下面的 SQL,但都给出了 SQL 错误。这给我一个错误,说我选择了超过 1 条记录。

DELIMITER $$
 CREATE 
    TRIGGER set_moment_display
     BEFORE INSERT ON data
     FOR EACH ROW

     BEGIN
       DECLARE moment DATETIME;

       SELECT press_moment_1 INTO moment FROM data LIMIT 1;

       IF moment > NEW.press_moment_1 THEN SET NEW.press_moment_1 = moment;
       END IF;
     END$$
DELIMITER ;

我如何实现我上面描述的。

【问题讨论】:

【参考方案1】:

这里的问题是,由于 SQL 数据库没有隐含的行排序概念(您为每个查询提供排序标准),因此触发器没有“前一个”行可供查看。 “先前插入的行”在插入触发器的上下文中没有任何意义。

假设它确实发生了,并且有几个进程在表中插入行。当触发器为进程#1 的插入触发时,哪一行是“前一个”行?先前由进程#1 插入的那个?假设按时间顺序排列的“最新”行实际上是由进程 #3 插入的?

如果您需要这样做,则无法在触发器中完成,除非您可以使用已知键值来标识您理解为“最新”的行。否则它必须在执行插入的应用程序中处理。

【讨论】:

【参考方案2】:

您可以使用别名“OLD”。

You can refer to columns in the subject table 
(the table associated with the trigger) by using the aliases OLD and NEW. 
OLD.col_name refers to a column of an existing row before 
it is updated or deleted. NEW.col_name refers to the column 
of a new row to be inserted or an existing row after it is updated

更新

Jim Garrison 正确地指出了我的错误,“BEFORE INSERT”没有“OLD”。值,此别名仅适用于 UPDATE 和 DELETE。

【讨论】:

这不是只对更新触发器有效吗?插入没有旧值。 哎呀...对不起这个错误!我现在已经意识到“插入之前”

以上是关于MySQL触发器:在插入之前将记录与先前的记录进行比较的主要内容,如果未能解决你的问题,请参考以下文章

按日期获取表的所有先前记录 MySQL

Pig 生成一个键更改列 - 将先前记录与当前记录进行比较,但列不同

mysql timestamp自动更新时间问题

使用游标更新Temp表中的记录

在插入之前触发删除记录

MySQL触发器初试:当A表插入新记录,自动在B表中插入相同ID的记录