0

テーブル members_new から にレコードを転送するトリガーを作成しましたmembers_old。トリガーの機能は、 insert in のmembers_oldに onにレコードを挿入することです。したがって、レコードがlikeに挿入されているとします。members_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 . ) 
)

このトリガーは今のところ機能していますが、私の混乱は、複数の挿入が一度に発生した場合に何が起こるかということです.

パフォーマンスが低下しますか?

FK があるため、いずれにしてもデッドロック状態に直面することmembers_oldはありますか?

この状況のより良い解決策があれば、それについて脚光を浴びてください

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 に答える