带触发器的多线程

时间:2013-02-13 13:47:07

标签: sql triggers

我编写了一个触发器,它将记录从表members_new转移到members_old。触发器的功能是在members_old中插入后的上将记录插入members_new。所以假设一条记录被插入members_new之类的

nMmbID   nMmbName  nMmbAdd 

1        Abhi     Bangalore 

此记录将插入members_old,具有与表

相同的数据结构

我的触发器就像:

create trigger add_new_record 
after 
insert on members_new
for each row 
INSERT INTO `test`.`members_old`
(
`nMmbID`, 
`nMmbName`,
`nMmbAdd`
)
(
SELECT
`members_new`.`nMmbID`, 
`members_new`.`nMmbName`,
`members_new`.`nMmbAdd`
FROM `test`.`members_new`
where nMmbID = (select max(nMmbID) from `test`.`members_new` // written to read   the last record from the members_new and stop duplication on the members_old , also this will reduce the chances of any error . ) 
)

此触发器现在正在运行,但我的困惑是如果在一个时刻发生多次插入会发生什么。

会降低性能吗?

在任何情况下我都会遇到死锁情况,因为members_old有FK?

如果有任何更好的解决方案,请关注那个

1 个答案:

答案 0 :(得分:1)

来自manual

  

您可以使用别名OLD和NEW来引用主题表(与触发器关联的表)中的列。 OLD.col_name在更新或删除之前引用现有行的列。 NEW.col_name引用要插入的新行的列或更新后的现有行。

create trigger add_new_record 
after 
insert on members_new
for each row 
INSERT INTO `test`.`members_old`
SET
`nMmbID` = NEW.nMmbID,
`nMmbName` = NEW.nMmbName,
`nMmbAdd` = NEW.nMmbAdd;

你会遇到死锁或其他问题。它也应该快得多,因为你不必在之前读取最大值(这也是不安全的,可能会导致数据泄露)。如果您对此感兴趣,请阅读隔离级别和交易......