2012-02-26 51 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