HOWTO · MySQL
MySQL で行が存在しない場合の挿入方法
この記事では、mySQL でテーブルがまだ存在しない場合に、テーブルに行を挿入する方法を示します。
このページの内容
このチュートリアルでは、mySQL でテーブルに行が存在しない場合に、テーブルに行を挿入する方法を説明します。
この問題を解決するには、REPLACE、INSERT IGNORE、INSERT ... ON DUPLICATE KEY UPDATE の 3つの簡単な方法があります。
まず、このように構造化されたテーブル person があるとします。
CREATE TABLE person (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT NOT NULL,
address VARCHAR(128)
);
次のように構造化されたテーブル person があるとします。
| id | name | age | address |
|---|---|---|---|
| 1 | John Doe | 27 | New York, New York |
| 2 | Jane Doe | 26 | Berlin, Germany |
| 3 | Chun Li | 24 | Beijing, China |
| 4 | Thor Odinson | 40 | Asgard |
では、実際の解決策に入ってみましょう。
MySQL に存在しない場合に REPLACE を使って挿入する
REPLACE が何をするかというと、既存のレコードが見つかったときに上書きし、まだ存在しない場合は新しい行を挿入します。基本的には UPDATE と似ていますが、INSERT の機能を持っています。
John Doe に REPLACE を実行するサンプルクエリを用意してみましょう。
REPLACE INTO 'person'
SET id = 1,
name = 'John Doe'`,
age = 28,
address = 'Los Angeles, California'
John Doe が存在する場合、その John Doe は新しいデータで上書きされ、存在しない場合は John Doe の新しいエントリが作成されます。
しかし、この方法は既存のレコードが見つかった場合にはスキップするのではなく、既存のレコードを上書きしてしまうため、挿入の効率は良くありません。これで仕事は完了しますが、それはそれを行うための最善の方法ではありません。
John Doe を選択したクエリの新しい結果は次のようになります。
| id | name | age | address |
|---|---|---|---|
| 1 | John Doe | 28 | Los Angeles, California |
John Doe の年齢と住所は REPLACE スクリプトによって変更または更新されています。
MySQL に存在しない場合に挿入するには INSERT IGNORE を使用する
これについても、上のテーブルと同じように編集されていないデータを使用します。
INSERT IGNORE では、レコードの主キーがすでにデータベースに存在する場合、それは静かに無視されるかスキップされます。
IGNORE キーワードを削除すると、id や主キーが存在するレコードを挿入すると問い合わせが中止され、主キーを持つレコードが既に存在するというエラーメッセージが表示されます。
INSERT の後の IGNORE は、エラーによる中止の代わりに、新しいレコードは挿入しないが問い合わせを続けるだけです。
INSERT IGNORE person
SET 'id' = 4,
age = 1000,
address = 'Chicago'
上で宣言したテーブルに基づいて、id または主キー 4 を持つレコードは既に存在している (Thor Odinson)。したがって、このクエリはスクリプトによって無視され、データベースにレコードを更新したり挿入したりすることはありません。
トールを person で検索すると、結果は次のようになります。
| id | name | age | address |
|---|---|---|---|
| 4 | Thor Odinson | 40 | Asgard |
年齢と住所は id 4 の行には全く影響を与えませんでした。
MySQL に存在しない場合の挿入には INSERT ... ON DUPLICATE KEY UPDATE を使用する
ON DUPLICATE KEY UPDATE 句を使用していて、挿入したい行が UNIQUE インデックスや主キーに重複している場合、その行は UPDATE を実行します。
これは基本的に REPLACE と同じことを行います。
例えば、id 2 のレコードを挿入したいとします。
INSERT INTO person (id, name, age, address)
VALUES (1, 'Jane Deer', '33', 'Tallahassee Florida')
ON DUPLICATE KEY UPDATE id = id+1;
id は既存のレコードを更新するのではなく、新しいレコードを生成するためにインクリメントされます。
person のすべての行を問い合わせると、以下のような結果になります。
| id | name | age | address |
|---|---|---|---|
| 1 | John Doe | 27 | New York, New York |
| 2 | Jane Doe | 26 | Berlin, Germany |
| 3 | Chun Li | 24 | Beijing, China |
| 4 | Thor Odinson | 40 | Asgard |
| 5 | Jane Deer | 33 | Tallahasee, Florida |
Jane Doe の代わりに Jane Deer が新しいレコードとしてテーブルに追加されます。
挿入して存在を確認する最も効率的な方法は INSERT IGNORE を使用することです。
挿入したい行が存在するかどうかを更新したい場合は REPLACE を使用します。行を変更したくないが、どうしても新しいレコードを挿入したい場合は INSERT ... ON DUPLICATE KEY UPDATE を使用します。