2014-10-10 57 views
0

說我有以下字段彌補我的表中的唯一關鍵:(產品ID VARCHAR(30),dateset日期,dateend日期)觸發器:獲取有關將要更新的行信息

我打算讓dateend爲空,直到用一個較新的dateset相同的productid另一行已經插入,就像這樣:

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

現在,我在想,我怎麼會放心地做到這一點,我想我」 d在插入新行之前運行觸發器。它本質上會找到當前max(dateset),其中productid = @productid,如果它存在,它將使用@ newdateset(我們新插入的後續行的日期)更新此行的日期。問題是,我不知道如何獲得變量@productid或@newdateset。有什麼方法可以獲得即將插入的行的信息嗎?如果我寫道:

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

如何讓我的觸發器說@productid ='DEMOA',@newdateset ='2014-10-10'?

感謝,

Zakiir

+0

一個觸發的最重要的方面是要能夠識別值。否則,你如何構建使用這些值的正確邏輯?所以,它在[MySQL關於觸發器的文檔]的第一段中有解釋(http://dev.mysql.com/doc/refman/5.6/en/trigger-syntax.html)。開發人員最重要的方面之一是能夠查找,解釋和使用有關所用工具的資源。所以,我低估了這個問題,因爲你似乎沒有努力去找到那些文檔。 – GolezTrol 2014-10-10 16:09:05

+0

你說得對,我沒有仔細查看文檔。它在那裏顯而易見,我錯過了它。 NEW.col_name – zedjay72 2014-10-10 16:24:09

+0

@ zedjay72如果您發現問題的答案,那麼如果您在下面簡明回答您自己的問題,它可以幫助其他Google的人。如果可以,請提供演示觸發器的代碼。 – 2014-10-10 17:26:19

回答

0

要引用的行現在將要更新的列,你會寫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