2

Mysql 5でテーブル値を更新したいのですが、キーが存在しない場合は作成してください。

私がそれをすることを見つけた方法は次のとおりです:

INSERT yyy ON DUPLICATE KEY UPDATE field;

問題は:上記の形式は他の方法よりも効率が悪いですか(挿入は1回だけ行われ、更新は非常に頻繁に行われるため)?

例えば:

$result = UPDATE field; 
if (num_rows_effected($result)==0) INSERT yyy

さらに:Mysqlでこれを行うためのより良い方法はありますか:たとえば、次のようなものがあります:

UPDATE value IF NO SUCH ROW INSERT yyy;

更新:REPLACEを提案した人のために、これが私の質問の拡張です:「ありがとう!すでにテーブルにあるカウンターを増やす必要があります(存在する場合)。そうでない場合は、この列に値1のテーブル行を作成します。この形式(REPLACE)で更新するにはどうすればよいですか?」

4

3 に答える 3

2

もありREPLACEます。

INSERT ON DUPLICATE KEY UPDATEUPDATE、重複するキーに出くわしたときにトリガーを起動し、FKon の場合に に違反しませんUPDATE

REPLACEが起動DELETEしてトリガーし、実行中の行を参照INSERTする に違反します。FKREPLACE

トリガーまたは がない場合はFK、 を使用するINSERT ON DUPLICATE KEY UPDATEと最も効率的です。

あなたはこのクエリを探しているようです:

INSERT
INTO table (key, counter)
VALUES (@key, 1)
ON DUPLICATE KEY UPDATE
  counter = counter + 1

REPLACEクエリを実行する前にカウンターの以前の値を選択していない限り、これを行うことはできません。

PS は以前にREPLACE登場し、互換性のためにのみ保持されています。使用によるパフォーマンスの向上はありません。MySQLON DUPLICATE KEY UPDATE

于 2009-02-18T15:32:46.803 に答える
1

はい、「replace」構文を使用できます。

REPLACE INTO table1 (key, col1, col2) values (1, 'val1','val2');

これはMySQLに固有の機能であり、必ずしも他のデータベースに実装されているとは限りません。

効率に関しては、MySQLが本質的に重複キーエラーをキャッチし、それに応じて処理するため、直接更新の方が高速になると思います。ただし、大量の挿入/更新を行わない限り、パフォーマンスへの影響はかなり小さくなります。

于 2009-02-18T15:27:53.240 に答える
-1

REPLACE コマンドを見てください。要件を満たしています。

于 2009-02-18T15:28:29.417 に答える