'replace into'を使用して複数の行を追加しようとしていますが、1つの行を更新しています。
REPLACE INTO user_balance
(user_id,acc_type,currency,balance,enable_deposit,
enable_withdrawal,pending_balance,update_ip)
VALUES (NEW.id,1,'USD',0,1,0,0,NEW.ip_address),
(NEW.id,1,'GBP',0,1,0,0,NEW.ip_address),
(NEW.id,1,'EUR',0,1,0,0,NEW.ip_address),
(NEW.id,1,'BTC',0,1,0,0,NEW.ip_address);
これは正しいですか、それをやっている方法ですか?
PS:ユーザーがユーザーテーブルに作成されるたびに、バランステーブルを更新するトリガーを使用しています。これは、1つの行を置き換える場合にうまく機能します。複数の行の場合、最後の値のみを更新します。
複数の行でREPLACE INTO
と一緒にトリガーを使用することは避けてください。どうして ?
REPLACE INTO
は、機械的なDELETE
およびINSERT
にすぎません。 mysqldがデッドロックに対処するように仕向けることができます(私の回答を参照してください アプリケーションでのデッドロックの発生を防ぐ方法は? )
the LIFO Trigger to Processing Triggers を示す2つのコメントを次に示します。
Atif Ghaffarが2007年9月23日に投稿9:12 pm [削除] [編集]してくださいREPLACEはDELETE操作を行うことに注意してください。
私たちはこれに気づかず、DELETEでトリガーされるトリガーがトリガーされました。
すべてのコードを確認した後、いくつかのフィールドの値を更新するための置換を行うスクリプトを見つけました。
代わりに、 "insert into ... on duplicate update"構文を使用するべきでした。
J Mikeによる2009年5月4日の投稿11:06 pm [削除] [編集] REPLACE INTOを使用している場合...トリガーはこの順序で起動されます(duplcateキーの削除が使用されている場合):
- 挿入する前
- 削除する前
- 削除後
- 挿入後
あなたの問題 ?単一の操作で複数回実行する必要がある場合、UPDATEトリガーは起動しません。少なくとも、私はそれが起こっているのを見ていません。
INSERT ... ON DUPLICATE KEY UPDATE
を使用することをお勧めします(私の回答を参照 1つの列に基づいてそのテーブルをソートしながら、別のテーブルから1つのテーブルを更新する )REPLACE
を実行する