2016-11-21 3 views
0

У меня есть 2 таблицы, давайте назовите ее таблицу A и таблицу B, каждый раз, когда что-то вставляется в таблицу, AI хочет, чтобы некоторые данные (id, name, comment) автоматически вставлялись также в таблицу B, но только в том случае, если в таблице B нет одинакового имени.MySQL, если условие внутри триггера

Пример:

Если вставить Object1 в А со значениями:

id=1, colour=2, name=example, price=5€, comment="blablabla" 

она должна быть вставлена ​​в таблице В строке с этими значениями:

id=1, name=example, comment="blablabla" 

, но если потом Я вставляю OBJECT2 в A со значениями:

id=2, colour=5, name=example, price=10€, comment="aaa"; 

ничего не должно произойти в таблице B, потому что в таблице B уже есть строка с именем = example.

Это мой код:

CREATE TRIGGER mytrigger 
BEFORE INSERT ON tablea 
    IF NOT EXISTS (SELECT * FROM tableb WHERE tableb.name = NEW.name) 
    THEN 
     INSERT INTO tableb (id, name, comment) 
      VALUES (NEW.id, NEW.name, NEW.comment) 
    END IF 

И это ошибка я получаю:

У Вас есть ошибка в вашем SQL синтаксиса ...

Я также попытался добавив BEGIN и END в начале и конце определения, также попытался с END вместо END IF, также попытался BEGIN вместо THEN

Кто-нибудь знает, что я делаю неправильно?

+5

Триггеры ** высоко конкретного производителя ** - поэтому, пожалуйста, добавить тег, чтобы указать, используете ли вы 'mysql',' 'postgresql', SQL-сервер ',' oracle' или 'db2' - или что-то еще. –

ответ

0

В PL/SQL вы не можете поставить EXISTS() в IF.

Поэтому, пожалуйста, попробуйте следующее:

CREATE OR REPLACE TRIGGER mytrigger 
BEFORE INSERT ON tablea REFERENCING NEW AS NEW 
FOR EACH ROW 
declare cnt integer; 
BEGIN 
    SELECT count(*) into cnt FROM tableb WHERE tableb.name = :NEW.name; 
    IF cnt >0 
    THEN 
     INSERT INTO tableb (id, name, comment) 
      VALUES (:NEW.id, :NEW.name, :NEW.comment) 
    END IF 
END; 
Смежные вопросы