存在する場合はレコードを更新し、存在しない場合は MySQL テーブルに挿入します

Shraddha Paghdar 2023年6月20日
存在する場合はレコードを更新し、存在しない場合は MySQL テーブルに挿入します

データベース管理者は、MySQL テーブルにレコードを追加したり、定期的に存在する場合は更新したりする必要がある場合があります。 ユーザーが既に存在するレコードまたは重複する PRIMARY KEY 値を持つレコードを挿入しようとすると、MySQL はアラートを送信します。

この記事では、この間違いを修正してより良い結果を得るために使用できる方法について概説します。

存在する場合はレコードを更新し、存在しない場合は MySQL テーブルに挿入する

行が実際に新しいか、または既に存在するかを判断した後に行を挿入する必要がある場合、MySQL はいくつかの役立つステートメントを提供します。

REPLACE INTO を使用して、レコードが存在する場合は更新します そうでない場合は、MySQL テーブルに挿入する

前に説明したように、UNIQUE または PRIMARY KEY 値が重複しているために INSERT コマンドが失敗する場合に、実際に行を置き換えたい場合は、REPLACE ステートメントを使用する方法があります。

REPLACE INTO ステートメントを使用する場合、発行された各コマンドには 2つの結果が考えられます。

  1. 目的の値を持つデータ行が見つからないため、通常の INSERT ステートメントが実行されます。
  2. 一致するデータ行が検出されると、通常の DELETE ステートメントを使用して既存の行が消去され、標準の INSERT が実行されます。

たとえば、iddepartmentemployee_name、および joining_year の列を持つ employees テーブルがあるとします。 departmentjoining_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 とは対照的に、非破壊的です。 必要に応じて実行するコマンド。

たとえば、iddepartmentemployee_name、および joining_year の列を持つ employees テーブルがあるとします。 departmentjoining_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 Paghdar avatar Shraddha Paghdar avatar

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

関連記事 - MySQL Update