2012-02-26 4 views
0

Давайте создадим таблицу TestParent, которая кэширует общее значение столбца num в таблице TestChild и вставляет некоторые строки.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

+0

Потому что это бесплатный движок базы данных с множеством недостатков, подобных этому. – Kamil

+0

1. MySQL не является бесплатным - он лицензирован GPL. 2. Это потому, что это не синтаксическая ошибка. После создания MySQL не имеет никакого способа узнать, в каком contex запускается триггер. Существует pososbility (хотя я не могу придумать что-либо в то время), где триггер, определенный как вы, имел бы смысл. – Mchl

 Смежные вопросы

  • Нет связанных вопросов^_^