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触发器:在插入之前将记录与先前的记录进行比较的主要内容,如果未能解决你的问题,请参考以下文章