2017-08-06 87 views
0

到期日我有一個觸發器,它應該根據您選擇創建觸發器來從外部值

DROP TRIGGER IF EXISTS `trigger_expiration_date`; 
CREATE DEFINER=`root`@`localhost` 
TRIGGER `trigger_expiration_date` 
BEFORE 
INSERT ON `contracts` 
FOR EACH ROW update contracts c 
inner join contract_types ct on c.id_contract_type = ct.id_contract_type 
set c.expiration_date = date_add(c.date_of_purchase, INTERVAL ct.nr_months MONTH) 

每當我運行的代碼是什麼訂閱式計算的訂閱的到期日期上面已經獲得批准,但只要我插入任何東西,我被告知我無法插入,因爲觸發器被調用

回答

0

的確,您不能在觸發器所在的同一張表上執行類似的更新。請使用new別名來引用正在插入的記錄。從documentation

在觸發器的身體,你可以通過使用別名OLDNEW引用列主題表格(與觸發器關聯的表)。 OLD.col_name在更新或刪除之前引用現有行的列。 NEW.col_name引用要插入的新行的列或更新後的現有行。

在你的情況,你可以做這樣的:

CREATE TRIGGER trigger_expiration_date 
BEFORE INSERT ON contracts 
FOR EACH ROW 
    SET new.expiration_date = (
     SELECT date_add(new.date_of_purchase, INTERVAL nr_months MONTH) 
     FROM contract_types 
     WHERE new.id_contract_type = id_contract_type); 
+0

太謝謝你了!我不知道該找什麼才能找到答案:-) –