2016-10-03 74 views
0

將數據插入到event_date列後,我想要一個觸發器來更新同一個表的兩列並將行的相應值'event_quarter'和'event_year'。當插入一行後觸發一個動作更新兩列的Mysql錯誤1442

我有這個測試table四列:

idevent_dateevent_quarterevent_year

我一直在努力與此代碼,使其工作:

DELIMITER $$ 

CREATE TRIGGER `fill_event_quarter_and_year` 
    AFTER INSERT 
    ON `test_table` 
    FOR EACH ROW 
BEGIN 
    DECLARE event_date_ DATE; 

    SELECT event_date 
    INTO event_date_ 
    FROM `test_table` 
    WHERE NEW.id = id; 

    UPDATE `test_table` 
     SET event_quarter = QUARTER(event_date_), event_year = YEAR(event_date_) 
    WHERE NEW.id = id; 
END 
$$ 

然而,我得到以下錯誤:

1442 - Can't update table 'test_table' in stored function/trigger because it is already used by statement which invoked this stored

function/trigger

我該如何解決?

然後它看起來像我必須做兩個觸發器,一個用於這個INSERT ing動作,另一個用於UPDATE動作。對?更新特定的行或記錄時會如何?

或者是否有可能觸發更新和插入操作?

回答

1

在觸發器中,不能使用正在更改的表作爲另一個查詢,這尤其意味着您無法更改或讀取該表的其他行。但是,您實際上可以更改當前正在更新/插入的行。

該行被稱爲new,您可以讀寫它,但必須使用語法set new.columnname = ...,而不使用update。這必須在before-觸發器中完成。

不能爲updateinsert結合觸發,所以你必須創建兩個,但可以使用兩個相同的代碼:

CREATE TRIGGER `trbins_fill_event_quarter_and_year` 
BEFORE INSERT ON `test_table` 
FOR EACH ROW 
    set new.event_quarter = QUARTER(new.event_date), 
     new.event_year = YEAR(new.event_date); 

CREATE TRIGGER `trbupd_fill_event_quarter_and_year` 
BEFORE UPDATE ON `test_table` 
FOR EACH ROW 
    set new.event_quarter = QUARTER(new.event_date), 
     new.event_year = YEAR(new.event_date);