web-dev-qa-db-ja.com

Mysql REPLACE INTOクエリで複数行挿入

'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つの行を置き換える場合にうまく機能します。複数の行の場合、最後の値のみを更新します。

3
aeroarunn

複数の行で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トリガーは起動しません。少なくとも、私はそれが起こっているのを見ていません。

提案

4
RolandoMySQLDBA