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'
插入已经发生,但存储的过程没有被调用。这是怎么回事?
就是这样,谢谢值。任何想法为什么id不能/在创建触发器时无法捕捉到这种错误? – spraff 2012-02-26 17:44:28
因为这是免费的数据库引擎,有很多像这样的缺点。 – Kamil 2012-02-26 17:57:51
1. MySQL不是免费的 - 它是GPL许可的。这是因为它不是语法错误。在创建时,MySQL无法知道触发器将在什么情况下执行。有一个可能性(虽然我当时不能提出),在那里你定义的触发器会有意义。 – Mchl 2012-02-26 18:20:12