2012-02-26 50 views
0

我們來創建一個TestParent表,它在TestChild表中緩存num列的總值,並插入一些行。SQL觸發器導致錯誤

CREATE TABLE TestParent (
id INT NOT NULL PRIMARY KEY, 
total INT NOT NULL DEFAULT 0); 

CREATE TABLE TestChild (
parent_id INT NOT NULL, 
num INT NOT NULL); 

INSERT INTO TestParent (id) VALUES (123); 
INSERT INTO TestChild (parent_id, num) VALUES (123, 1); 

CREATE PROCEDURE Sync (IN parent INT) 
    UPDATE TestParent SET total = (
     SELECT SUM(num) FROM TestChild WHERE parent_id=parent) 
    WHERE id=parent; 

CALL Sync (123); 

到目前爲止,這麼好。現在,我想Sync被自動調用...

CREATE TRIGGER TestInsert 
AFTER INSERT ON TestChild 
FOR EACH ROW CALL Sync (parent_id); 

這也適用。現在,

INSERT INTO TestChild (parent_id, num) VALUES (123, 1); 

#1054 - Unknown column 'parent_id' in 'field list' 

插入已經發生,但存儲的過程沒有被調用。這是怎麼回事?

回答

2

您需要使用NEW.parent_id來指代剛剛插入

CREATE TRIGGER TestInsert 
AFTER INSERT ON TestChild 
FOR EACH ROW CALL Sync (NEW.parent_id); 
+0

就是這樣,謝謝值。任何想法爲什麼id不能/在創建觸發器時無法捕捉到這種錯誤? – spraff 2012-02-26 17:44:28

+0

因爲這是免費的數據庫引擎,有很多像這樣的缺點。 – Kamil 2012-02-26 17:57:51

+0

1. MySQL不是免費的 - 它是GPL許可的。這是因爲它不是語法錯誤。在創建時,MySQL無法知道觸發器將在什麼情況下執行。有一個可能性(雖然我當時不能提出),在那裏你定義的觸發器會有意義。 – Mchl 2012-02-26 18:20:12