2016-09-11 76 views
0

我想新列在觸發器添加到表後添加列,但它不工作插入與觸發,錯誤1422

DELIMITER // 
DROP TRIGGER IF EXISTS add_dep_oncall// 
CREATE TRIGGER add_dep_oncall 
AFTER INSERT ON `department` 
FOR EACH ROW 
BEGIN 

DECLARE col_name varchar(30); 
SET col_name = NEW.department_name; 

ALTER TABLE `oncall` ADD COLUMN col_name VARCHAR(255) DEFAULT NULL; 

END// 

我使用MariaDB的。

運行SQL上面的代碼後,錯誤是

Explicit or implicit commit is not allowed in stored function or trigger. 

感謝任何幫助。

回答

3

存儲函數和觸發器不允許交易,並承諾(這將是明確的提交)也不允許DDL操作(這是隱含提交)。

DML - 數據操作語言。檢索和設置數據的操作。這些應該是你觸發器的焦點。

DDL - 數據定義語言。改變表格結構的操作。這些不應該是觸發器。

所以,你ALTER TABLE是DDL,它是不允許的。

此外,DDL程序是耗時的。 ALTER TABLE可能需要幾分鐘或幾小時才能運行。即使守護進程允許它,也不能在同行評審中倖免於正確使用高性能RDBMS。手動設置您的模式,並使用它。除了更多的分階段數據遷移或轉換之外,不要動態添加列。

已經有在棧中的幾個問題,關於觸發器在飛行中添加列。特別是從新開發人員到SQL,他們認爲他們的「即時」添加列是有道理的。它永遠不會。它通常是一個糟糕的設計理念的指標。比如,這是一年中的新一週,讓我們添加一個新的專欄。

直播觸發對DDL的地方。