存在する場合はレコードを更新し、存在しない場合は MySQL テーブルに挿入します
データベース管理者は、MySQL テーブルにレコードを追加したり、定期的に存在する場合は更新したりする必要がある場合があります。 ユーザーが既に存在するレコードまたは重複する PRIMARY KEY
値を持つレコードを挿入しようとすると、MySQL はアラートを送信します。
この記事では、この間違いを修正してより良い結果を得るために使用できる方法について概説します。
存在する場合はレコードを更新し、存在しない場合は MySQL テーブルに挿入する
行が実際に新しいか、または既に存在するかを判断した後に行を挿入する必要がある場合、MySQL はいくつかの役立つステートメントを提供します。
REPLACE INTO
を使用して、レコードが存在する場合は更新します そうでない場合は、MySQL テーブルに挿入する
前に説明したように、UNIQUE
または PRIMARY KEY
値が重複しているために INSERT
コマンドが失敗する場合に、実際に行を置き換えたい場合は、REPLACE
ステートメントを使用する方法があります。
REPLACE INTO
ステートメントを使用する場合、発行された各コマンドには 2つの結果が考えられます。
- 目的の値を持つデータ行が見つからないため、通常の
INSERT
ステートメントが実行されます。 - 一致するデータ行が検出されると、通常の
DELETE
ステートメントを使用して既存の行が消去され、標準のINSERT
が実行されます。
たとえば、id
、department
、employee_name
、および joining_year
の列を持つ employees
テーブルがあるとします。 department
と joining_year
of id
= 101 レコードを元の Operations
レコードに戻すことを決定しました。
-- Before update
SELECT * from employees where id = 101;
REPLACE INTO employees
(id, department, employee_name, joining_year)
VALUES
(101, 'Operations', 'John Doe', 2013);
-- After update
SELECT * from employees where id = 101;
MySQL と互換性のあるブラウザで上記のコード行を実行します。 次の結果が表示されます。
出力:
-- Before update
+----+------------+---------------+----------------+
| id | department | employee_name | year_published |
+----+------------+---------------+----------------+
|101 | Technology | John Doe | 2017 |
+----+------------+---------------+----------------+
Query OK, 2 rows affected (0.01 sec)
-- After update
+----+------------+---------------+----------------+
| id | department | employee_name | year_published |
+----+------------+---------------+----------------+
|101 | Operations | John Doe | 2013 |
+----+------------+---------------+----------------+
この例では、1つの項目のみを変更したにもかかわらず、前のレコードを DELETED し、新しい行を INSERTED して代わりに使用したため、結果は 2つの行が影響を受けたことを示しています。
INSERT ... ON DUPLICATE KEY UPDATE
を使用して、レコードが存在する場合は更新します そうでない場合は、MySQL テーブルに挿入する
UNIQUE
または PRIMARY KEY
値が重複している可能性がある行に挿入するための代替アプローチとして、INSERT ... ON DUPLICATE KEY UPDATE
ステートメントと句を使用できます。
INSERT
または UPDATE
命令のみを発行し、DELETE
を発行しないことにより、INSERT... ON DUPLICATE KEY UPDATE
の利用は、DELETE
のために本質的に有害である REPLACE
とは対照的に、非破壊的です。 必要に応じて実行するコマンド。
たとえば、id
、department
、employee_name
、および joining_year
の列を持つ employees
テーブルがあるとします。 department
と joining_year
of id
= 101 レコードを元の Operations
レコードに戻すことを決定しました。
新しい ON DUPLICATE KEY UPDATE
句を元の INSERT
ステートメントに追加できるようになりました。
-- Before update
SELECT * from employees where id = 101;
SET @id = 101,
@department = 'Operations',
@employee_name = 'John Doe',
@joining_year = 2013;
INSERT INTO employees
(id, department, employee_name, joining_year)
VALUES
(@id, @department, @employee_name, @joining_year)
ON DUPLICATE KEY UPDATE
department = @department,
employee_name = @employee_name,
joining_year = @joining_year;
-- After update
SELECT * from employees where id = 101;
上記の例では、ON DUPLICATE KEY UPDATE
メソッドが機能する必要はありませんが、ユーザー変数を使用して、INSERT
または UPDATE
に必要な実際の値を複数回宣言することを回避することを選択しました。 思惑通り。
上記のコード行を、MySQL と互換性のあるブラウザーで実行します。 次の結果が表示されます。
出力:
-- Before update
+----+------------+---------------+----------------+
| id | department | employee_name | year_published |
+----+------------+---------------+----------------+
|101 | Technology | John Doe | 2017 |
+----+------------+---------------+----------------+
Query OK, 1 rows affected (0.00 sec)
-- After update
+----+------------+---------------+----------------+
| id | department | employee_name | year_published |
+----+------------+---------------+----------------+
|101 | Operations | John Doe | 2013 |
+----+------------+---------------+----------------+
Shraddha is a JavaScript nerd that utilises it for everything from experimenting to assisting individuals and businesses with day-to-day operations and business growth. She is a writer, chef, and computer programmer. As a senior MEAN/MERN stack developer and project manager with more than 4 years of experience in this sector, she now handles multiple projects. She has been producing technical writing for at least a year and a half. She enjoys coming up with fresh, innovative ideas.
LinkedIn