mysql - TRIGGERS:获取有关要更新的行的信息

标签 mysql triggers

假设我有以下字段构成表中的唯一键:(productid varchar(30)、日期集日期、日期结束日期)

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

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

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

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

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

谢谢

扎基尔

最佳答案

要引用行中即将更新的列,您可以编写 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

关于mysql - TRIGGERS:获取有关要更新的行的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26303576/

相关文章:

mysql - 我有哪些选择可以使我的 ORDER BY 更快?

mysql - 西里尔文、AJAX 和数据库

mysql - 使用已存在的主键将新行插入到 mysql 表中

mysql - 双向外键约束检查

javascript - 2 个 JavaScript 事件按顺序触发 - 第 2 个被忽略

sql - 超过堆栈深度限制 PostgreSQL

php - 从数据库中获取数据时html网格显示错误

wpf - IsPressed 触发器(按钮)导致异常

sql - INSTEAD OF 触发器和 CASCADE 路径

Mysql 'statement level' 触发器...你可以用两个技巧来做到这一点