6

次のような MySQL クエリがあります。

INSERT INTO beer(name, type, alcohol_by_volume, description, image_url) VALUES('{$name}', {$type}, '{$alcohol_by_volume}', '{$description}', '{$image_url}')

唯一の問題は、名前が一意の値であることです。つまり、重複に遭遇すると、次のようなエラーが発生します。

Error storing beer data: Duplicate entry 'Hocus Pocus' for key 2

SELECTデータベース全体に対してクエリを実行せずに、SQL クエリが既に存在する一意の値を追加しようとしないようにする方法はありますか?

4

5 に答える 5

8

もちろん、次のように INSERT IGNORE INTO を使用できます。

INSERT IGNORE INTO beer(name, type, alcohol_by_volume, description, image_url) VALUES('{$name}', {$type}, '{$alcohol_by_volume}', '{$description}', '{$image_url}')

同様に使用できますON DUPLICATE KEYが、行を追加したくない場合INSERT IGNORE INTOは、より良い選択です。ON DUPLICATE KEY重複がある場合に、より具体的なことをしたい場合に適しています。

使用する場合はON DUPLICATE KEY、複数の一意のインデックスを持つテーブルでこの句を使用しないでください。複数の一意のインデックスを持つテーブルがある場合、ON DUPLICATE KEY句は予期しない結果をもたらす可能性があります (実際に何が起こるかを 100% 制御することはできません)。

例: - 以下の行は、1 つの行のみを更新します (タイプが 1 で、alcohol_by_volume が 1 の場合 (両方の列が一意のインデックスである場合))。

ON DUPLICATE KEY UPDATE beer SET type=3 WHERE type=1 or alcohol_by_volume=1

要約すると:

ON DUPLICATE KEY重複がある場合、警告やエラーなしで作業を行います。

INSERT IGNORE INTO重複がある場合は警告をスローしますが、それ以外に、重複をデータベースに挿入することを無視します。

于 2013-05-02T12:56:47.670 に答える
6

たまたま、MySQL には を使用する方法がありますON DUPLICATE KEY UPDATE。これは MySQL 4.1 以降で利用可能です

INSERT INTO beer(name, type, alcohol_by_volume, description, image_url)
  VALUES('{$name}', {$type}, '{$alcohol_by_volume}', '{$description}',
  '{$image_url}')
  ON DUPLICATE KEY UPDATE type=type;

代わりに使用することもできますINSERT IGNORE INTO...が、ステートメントは引き続き警告をスローします (エラーではなく)。

于 2013-05-02T12:56:31.620 に答える
2

はいあります。ON DUPLICATE KEYmysqlINSERTステートメントの句を使用できます。構文はここで説明されています

INSERT INTO beer(name, type, alcohol_by_volume, ...) 
  VALUES('{$name}', {$type}, '{$alcohol_by_volume}', ...)
  ON DUPLICATE KEY UPDATE 
     type={$type}, alcohol_by_volume = '{$alcohol_by_volume}', ... ;
于 2013-05-02T12:56:35.447 に答える
0

はい、最初にデータベースから名前を選択し、クエリの結果が null (ゼロ レコード) でない場合、その名前は既に存在するため、別の名前を取得する必要があります。

于 2013-05-02T12:56:10.537 に答える
0

簡単に言えば、何かが重複した名前を挿入しようとしている場合、コードは何をしたいのかを理解する必要があります。そのため、最初に行う必要があるのは、select ステートメントを実行することです。

 SELECT * FROM beer WHERE name='{$name}'

そして、それから「if」ステートメントを実行して、結果が得られたかどうかを判断します。

結果 = 0 の場合は、先に進んで挿入を実行してください。そうでなければ...あなたがやりたいことは何でも。ユーザーにエラーを返しますか? 別の方法でデータベースを変更しますか? 完全に無視?この挿入ステートメントはどのように発生しますか? ファイルからの一括更新?Web ページからのユーザー入力?

この挿入ステートメントに到達する方法と、それがワークフローにどのように影響するかによって、その「else」をどのように処理するかが正確に決定されます。しかし、あなたは間違いなくそれを処理する必要があります。

ただし、select ステートメントと insert ステートメントが一緒にトランザクション内にあることを確認してください。そうすれば、他の人が同じようなことをしようとしても問題になりません。

于 2013-05-02T12:59:41.590 に答える