2014-10-16 3 views
0

Привет, ребята, я новичок в mysql.Я сделал некоторый код с триггером mysql, но он выдает мне ошибку во втором условии. КодОшибка триггера с mysql во втором случае

Это один работает отлично

create table foo (a INT, b INT, ts TIMESTAMP); 
create table bar (a INT, b INT); 

INSERT INTO foo (a,b) VALUES(5,1); 
INSERT INTO foo (a,b) VALUES(4,2); 


INSERT INTO foo (a,b) VALUES(3,3); 


CREATE TRIGGER ins_sum AFTER UPDATE ON foo 

FOR EACH ROW 
insert into bar values(OLD.a,NEW.b); 



UPDATE foo SET a = 3 WHERE b = 1; 

Он успешно выводит 5.

Код ошибки

create table foo (a INT, b INT, ts TIMESTAMP); 
create table bar (a INT, b INT); 

INSERT INTO foo (a,b) VALUES(5,1); 
INSERT INTO foo (a,b) VALUES(4,2); 
INSERT INTO foo (a,b) VALUES(3,3); 



CREATE TRIGGER ins_sum AFTER UPDATE ON foo 
FOR EACH ROW 
insert into bar values(OLD.a,NEW.b); 
insert into bar values(OLD.a,NEW.b); 

UPDATE foo SET a = 3 WHERE b = 1; 

Когда я назвал как select a from bar where b = 1 .Отель ожидаемого результата 5 and 4.

Но вместо этого .it выходы как Schema Creation Failed: Unknown column 'OLD.a' in 'field list':

Так что мой вопрос, почему не делает второй вариант работы здесь ..Whay косяк я добавить NEW.a and NEW.b в операторе вставки второй раз.

Thanx за помощь ..

+0

ли вы на самом деле означает, чтобы вставить те же значения, дважды во втором варианте? Почему вы ожидаете, что результаты 'SELECT' будут' 5' и '4'? Я просто получаю '5'. – Barmar

+0

@Barmar см., Когда мы используем 'UPDATE foo SET a = 3 WHERE b = 1;' значение a и b будет 3 и 1, что является новым значением. Я использовал 'insert into bar values ​​(OLD.a , NEW.b); 'поэтому в старом разделе это должно быть 5, который отлично работает .. и там во второй строке старое значение равно 4 ..why 4 is not print вместо вывода 5. Что я хочу в выводе 5 и 4. –

+0

@Barmar старое значение установлено равным 5 (которое находится в первой строке во второй строке, старое значение a равно 4 .. почему бы не получить доступ к нему. Возможно ли это с помощью триггеров ??. если да, пожалуйста, помогите мне .. –

ответ

0

Вам нужна команда DELIMITER так, что точка с запятой не заканчивается определение триггера. Кроме того, необходимо BEGIN ... END блок поместить несколько команд в FOR EACH ROW петлю

DELIMITER // 
CREATE TRIGGER ins_sum AFTER UPDATE ON foo 
    FOR EACH ROW 
    BEGIN 
     insert into bar values(OLD.a,NEW.b); 
     insert into bar values(OLD.a,NEW.b); 
    END 
// 
DELIMITER ; 

DEMO

+0

это не помогло мне. Я бросаю мне ошибку, было бы очень полезно, если бы вы показали скрипт sql .. я бы, конечно, согласился с этим –

+0

Я добавил ссылку на мой sqlfiddle. Он использует меню sqlfiddle для установки разделителя инструкций; 'DELIMITER' не является оператором SQL, это функция интерфейса интерфейса командной строки' mysql'. – Barmar

+0

см., Когда мы используем 'UPDATE foo SET a = 3 WHERE b = 1;' значение a и b будет 3 и 1, что является новым значением. Я использовал 'insert into bar values ​​(OLD.a, NEW .b); 'поэтому в старом разделе это должно быть 5, который отлично работает .. и там во второй строке старое значение равно 4 ..why 4 is not напечатано вместо вывода 5. Что я хочу в выводе 5 и 4. –

0

Проблема в том, что этот раздел:

CREATE TRIGGER ins_sum AFTER UPDATE ON foo 
FOR EACH ROW 
insert into bar values(OLD.a,NEW.b); 
insert into bar values(OLD.a,NEW.b); 

является два заявления. У вас две точки с запятой, поэтому MySQL разбирает ее как две команды. Первая команда существо:

CREATE TRIGGER ins_sum AFTER UPDATE ON foo 
FOR EACH ROW 
insert into bar values(OLD.a,NEW.b); 

второе одно существо:

insert into bar values(OLD.a,NEW.b); 

Это вторая команда не действует.


Поскольку вы вставив multiple times into the same table, вы можете попробовать что-то вроде этого, вместо:

CREATE TRIGGER ins_sum AFTER UPDATE ON foo 
FOR EACH ROW 
insert into bar values (OLD.a, NEW.b), (OLD.a, NEW.b); 
+0

Можете ли вы предоставить мне ответ на скрипт sql. Мне было бы полезно нарисовать –

+0

, это не помогло .. –

+0

Сбой создания схемы: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «значениями (OLD.a, NEW.b)» в строке 4: –

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