0

我编写了一个触发器,它将记录从表 members_new 传输到members_old. trigger 的作用是在 insert in之后在members_old on中插入一条记录。所以假设一条记录被插入到一个likemembers_newmembers_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,我会在任何情况下面临僵局吗?

如果有针对这种情况的更好解决方案,请关注

4

1 回答 1

1

手册

您可以使用别名 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;

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

于 2013-02-13T14:01:45.410 回答