当我在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 ;
我如何实现上述目标。
答案 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插入的?
如果您需要这样做,除非您可以使用已知键值来识别您理解为“最近”的行,否则无法在触发器中完成此操作。否则,必须在执行插入的应用程序中处理它。