0

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

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

4

2 回答 2

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。

于 2012-09-12T05:18:10.143 回答
0

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

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

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

于 2012-09-12T05:26:19.127 回答