SQL триггер вставки строки в две таблицы - PullRequest
5 голосов
/ 23 декабря 2010

Я искал способ создания триггера, который бы вставлял одну и ту же строку в две таблицы с одинаковыми значениями.

Например, новая строка вставляется в pushNotificationQueue, как только она вставляется, я хотел бы, чтобы эту же точную строку вставляли в сообщения.

Я пробовал это

CREATE TRIGGER add_to_messages
after insert on mbb_pushNotificationQueue
FOR EACH ROW
insert into mbb_messages select * from mbb_pushNotificationQueue

единственная проблема в том, что он проходит и добавляет записи, которые уже были добавлены ранее.

Ответы [ 5 ]

4 голосов
/ 23 декабря 2010

Вы должны сказать, с какими rdbms вы работаете.В любом случае, вы должны использовать специальную таблицу, обычно называемую вставленной или похожей.

Это для Sql Server:

INSERT INTO mbb_messages SELECT * FROM INSERTED

Другие, такие как Sybase, используют предложение REFERENCES, чтобы добраться до вновь вставленной записи.:

create trigger TriggerName after insert on
TableName
referencing new as new_name

А для MySQL (который, похоже, вы используете) вы можете ссылаться на вновь вставленные записи, используя таблицу NEW:

CREATE TRIGGER add_to_messages
after insert on mbb_pushNotificationQueue
FOR EACH ROW BEGIN
    insert into mbb_messages select * from NEW;
END;
2 голосов
/ 19 апреля 2016

Вам необходимо использовать имя столбца с новым ключевым словом. Пожалуйста, найдите триггер ниже:

DELIMITER $$
CREATE TRIGGER add_to_message
after insert on mbb_pushNotificationQueue
FOR EACH ROW BEGIN
    insert into mbb_oushNotificationQueue(`col1`, `col2`) values(new.col1, new.col2);
END$$
DELIMITER ;
1 голос
/ 24 декабря 2010

Я использовал

CREATE TRIGGER add_to_messages
after insert on mbb_pushNotificationQueue
FOR EACH ROW
INSERT INTO mbb_messages SET messageID = NEW.messageID, 
toUserID = NEW.toUserID, 
fromUserID =  NEW.fromUserID, message = NEW.message, dateReceived = NEW.dateReceived

Спасибо всем, кто написал.

1 голос
/ 23 декабря 2010

Прежде всего, я говорю, что использование select * с оператором insert-select действительно, действительно плохая идея.Причина в том, что вы никогда не можете предсказать порядок столбцов, которые возвращаются из выбора.

Во-вторых, предполагая SQL Server, я бы предложил использовать следующее:

create trigger add_to_message
    instead of insert on mbb_pushNotificationQueue
    for each row 
as
    begin transaction
        insert into mbb_oushNotificationQueue (col1, col2, col3)
            select col1, col2, col3
                from inserted

        insert into mbb_messages (col1, col2, col3)
            select col1, col2, col3
                from inserted

       if @@ERROR_LEVEL = 0
           commit
      else
           rollback

Отказ от ответственности:

Этот код не был проверен и может потребовать некоторых незначительных исправлений, но хорошо иллюстрирует идею.

0 голосов
/ 23 декабря 2010

Так что добавляйте только последнюю добавленную запись.

insert into mbb_messages select blah from mbb_pushNotificationQueue where blah meets some criteria....

Наличие max (id) или что-то.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...