【问题标题】:TRIGGERS: getting information about the row about to be updated触发器:获取有关要更新的行的信息
【发布时间】:2014-12-05 20:50:45
【问题描述】:

假设我的表中有以下字段构成唯一键:(productid varchar(30), dateset date, dateend date)

我打算让 dateend 为空,直到插入具有相同 productid 和较新日期集的另一行,如下所示:

+----------+-------------+-------------+
|productid | dateset     | dateend     |
+----------+-------------+-------------+
|'PRODUCTA'|'2014-10-09' | NULL        |
+----------+-------------+-------------+
|'PRODUCTA'|'2009-08-06' |'2014-10-09' |
+----------+-------------+-------------+

现在,我正在考虑如何安全地执行此操作,并且我认为我会在插入新行之前运行触发器。它本质上会找到productid = @productid 的当前max(dateset),如果存在,它将使用@newdateset 更新该行的dateend,即插入我们新的后续行的日期。问题是,我不知道如何获取变量@productid 或@newdateset。有什么方法可以获取现在将要插入的行的信息?如果我写:

insert into products (productid, dateset) values ('DEMOA', '2014-10-10')

如何让我的触发器说出@productid = 'DEMOA', @newdateset = '2014-10-10'?

谢谢,

扎基尔

【问题讨论】:

  • 触发器最重要的方面之一是能够识别值。否则,您如何构建使用这些值的正确逻辑?因此,它在MySQL documentation about triggers 的第一段中进行了解释。开发人员最重要的方面之一是能够找到、解释和使用有关他们使用的工具的资源。因此,我对这个问题投了反对票,因为您似乎甚至没有努力找到那些文档。
  • 你说得对,我没有仔细阅读文档。它就在眼前,我错过了。 NEW.col_name
  • @zedjay72 如果您找到了问题的答案,那么如果您在下面简明地回答您自己的问题,这将对以后使用 Google 搜索的其他人有所帮助。如果可以,请提供演示触发器的代码。

标签: mysql triggers


【解决方案1】:

要引用现在即将更新的行中的列,您可以编写 NEW.col_name,在我的例子中:

NEW.productid

将在以下插入语句中引用“DEMOA”:

insert into products (productid, dateset) values ('DEMOA', '2014-10-10');

像这样:

delimiter //

CREATE TRIGGER update_row_version BEFORE INSERT ON products 
FOR EACH ROW
BEGIN 
SELECT productid, max(dateset) INTO @productid, @maxdateset FROM products WHERE productid = NEW.productid; 
END;//

delimiter ;

INSERT INTO products (productid, price_local) VALUES ('DEMOA', 3000.00);

select @productid;

+-----------+
| @productid|
+-----------+
| DEMOA     |
+-----------+

显然,我试图实现的目标是不可能的,因为触发器不允许我更新我试图插入的同一个表(错误 1442)。已经有一篇关于它的帖子:

mysql trigger stored trigger is already used by statement which invoked stored trigger

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    相关资源
    最近更新 更多