2016-09-22 106 views
0

我必須在表中插入一個新行,其中包含對另一個表的ID的引用的文本列。例如: INSERT INTO table1(reference,date)VALUES('23,24,25','2016-09-22');「在哪裏」插入後觸發器

我的觸發器應更新table2.status其中table2.id是table1.reference值之一。現在是這樣的:

DELIMITER ;; 
CREATE TRIGGER `rim_ai` AFTER INSERT ON `table1` FOR EACH ROW 
UPDATE table2 SET status = 11 WHERE id IN (NEW.reference);; 
DELIMITER ; 

但是...我發現狀態值僅在第一行上更改(例如,一個ID爲23)。 如果在我的觸發器中發生什麼事情,它應該什麼都不更新! 我應該將參考字段轉換爲「文本」以外的內容嗎? 在此先感謝。

回答

0

這不是你的觸發器壞了,而是你的桌子設計。你真的不應該在由逗號(或任何其他分隔符)分隔的單個字段中存儲一系列值。您應該將每個參考日期對存儲在其自己的記錄中。

而不是

reference | date 
23,24,25 |2016-09-22 

reference | date 
23  |2016-09-22 
24  |2016-09-22 
25  |2016-09-22 

在這種情況下按預期的觸發將工作。雖然,我會稍微改寫了where條款:

...WHERE id = NEW.reference 

你可以從技術上讓使用多表更新語句,並find_in_set()功能的當前數據結構觸發工作,但我不建議。

爲您所遇到的行爲的原因是,id IN (NEW.reference)表達不會評價爲id IN (23,24,25)(設置在操作者in 3個值的),但如(含有單串的3個數字)id IN ('23,24,25')。 MySQL將'23,24,25'字符串靜默轉換爲數字,這將導致數字23(23之後的逗號不能被解釋爲數字的一部分,因此MySQL以轉換返回23作爲數字停止)。因此只更新id = 23的記錄。

+0

你顯然是對的......我懶洋洋地試圖解決引用表的創建問題。謝謝。 –