INSERT INTO ... SELECTを使ってMySQLテーブルを更新する
MySQLのテーブルを別のテーブルのデータで更新する方法
MySQLでテーブルデータを更新する方法はいくつかありますが、別のテーブルのデータを使って更新したい場合、いくつか方法があります。
方法
- JOINを使ったUPDATE
UPDATE テーブル1 AS t1
JOIN テーブル2 AS t2
ON t1.結合カラム = t2.結合カラム
SET t1.更新カラム = t2.更新カラム;
結合カラム
は、2つのテーブルを結合するための共通カラムです。更新カラム
は、更新したいカラムです。
例
users
テーブルと orders
テーブルがあり、users
テーブルの user_id
と orders
テーブルの customer_id
が一致しているとします。 orders
テーブルの order_status
を使って users
テーブルの last_order_status
を更新したい場合、以下のSQLを使用します。
UPDATE users AS u
JOIN orders AS o
ON u.user_id = o.customer_id
SET u.last_order_status = o.order_status;
- UPDATEとSELECTを使ったサブクエリ
UPDATE テーブル1
SET 更新カラム = (SELECT サブクエリ);
サブクエリ
は、更新したいデータを取得するSELECT文です。
products
テーブルの price
を、sales
テーブルの平均販売価格で更新したい場合、以下のSQLを使用します。
UPDATE products
SET price = (SELECT AVG(sales_price) FROM sales);
users
テーブルの email
を、email_updates
テーブルの email
で更新したい場合、以下のSQLを使用します。
-- 一時テーブル作成
CREATE TEMPORARY TABLE temp_users (
user_id INT,
email VARCHAR(255)
);
-- 一時テーブルにデータコピー
INSERT INTO temp_users (user_id, email)
SELECT user_id, email FROM email_updates;
-- 一時テーブルを使って元のテーブルを更新
UPDATE users
JOIN temp_users AS t
ON users.user_id = t.user_id
SET users.email = t.email;
-- 一時テーブル削除
DROP TEMPORARY TABLE temp_users;
上記の3つの方法を使い分けることで、別のテーブルのデータを使ってMySQLテーブルを更新することができます。 状況に合わせて最適な方法を選択してください。
補足
- 上記の例は、基本的なものです。 実際の状況に合わせて、WHERE条件などを追加する必要があります。
- データ更新前に、必ずバックアップを取ってください。
環境
- MySQL 8.0
- テーブル構造
-- テーブル1
CREATE TABLE table1 (
id INT PRIMARY KEY,
name VARCHAR(255),
age INT
);
-- テーブル2
CREATE TABLE table2 (
id INT PRIMARY KEY,
address VARCHAR(255),
city VARCHAR(255)
);
-- テーブル1のnameをテーブル2のaddressで更新
UPDATE table1 AS t1
JOIN table2 AS t2
ON t1.id = t2.id
SET t1.name = t2.address;
-- テーブル1のageをテーブル2のcityの長さで更新
UPDATE table1
SET age = (SELECT LENGTH(city) FROM table2 WHERE table2.id = table1.id);
-- 一時テーブル作成
CREATE TEMPORARY TABLE temp_table (
id INT,
name VARCHAR(255)
);
-- 一時テーブルにデータコピー
INSERT INTO temp_table (id, name)
SELECT id, name FROM table1;
-- 一時テーブルを使って元のテーブルを更新
UPDATE table1
JOIN temp_table AS t
ON table1.id = t.id
SET table1.name = CONCAT(t.name, " (updated)");
-- 一時テーブル削除
DROP TEMPORARY TABLE temp_table;
実行
上記のコードをMySQLクライアントで実行して、結果を確認してください。
注意
- 上記のコードは、サンプルです。 実際の状況に合わせて、コードを修正する必要があります。
MySQLテーブルを別のテーブルのデータで更新する他の方法
方法4: REPLACE INTO
REPLACE INTO table1 (id, name, age)
SELECT id, name, age FROM table2;
REPLACE INTO
は、既存のレコードがあれば更新し、なければ挿入します。- 主キーが重複する場合は、既存のレコードが更新されます。
方法5: INSERT INTO ... SELECT
INSERT INTO table1 (id, name, age)
SELECT id, name, age FROM table2
WHERE table2.age > 18;
INSERT INTO ... SELECT
は、SELECT文で取得したデータを挿入します。- WHERE条件を追加することで、挿入するレコードを絞り込むことができます。
方法6: トリガー
トリガーは、特定の操作が行われたときに自動的に実行されるプログラムです。
- INSERTトリガーを使って、別のテーブルにデータが挿入されたときに、自動的にテーブルを更新することができます。
上記の方法を使い分けることで、状況に合わせて最適な方法でMySQLテーブルを更新することができます。
mysql sql-update