MySQL Trigger:在插入之前将记录与之前的记录进行比较

时间:2012-09-12 05:02:37

标签: mysql triggers

当我在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 ;

我如何实现上述目标。

2 个答案:

答案 0 :(得分:0)

您可以使用别名“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。

答案 1 :(得分:0)

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

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

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