我一直在寻找一种方法来创建一个触发器,将相同的行插入到具有相同值的两个表中。
例如,插入后会立即将新行插入pushNotificationQueue,我希望将相同的行插入到消息中。
我试过这个
CREATE TRIGGER add_to_messages
after insert on mbb_pushNotificationQueue
FOR EACH ROW
insert into mbb_messages select * from mbb_pushNotificationQueue
唯一的问题是它会通过并添加之前已添加的条目。
答案 0 :(得分:4)
您必须说明您正在使用哪些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;
答案 1 :(得分:2)
您需要将列名称与new关键字一起使用。请在下面找到触发器:
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 ;
答案 2 :(得分:1)
首先,我说使用带有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
<强>声明:强>
此代码尚未经过测试,可能需要一些小修复,但很好地说明了这个想法。
答案 3 :(得分:1)
我最终使用
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
感谢所有发帖的人。
答案 4 :(得分:0)
所以只添加最后添加的记录。
insert into mbb_messages select blah from mbb_pushNotificationQueue where blah meets some criteria....
有max(id)或其他东西。