サンプルコード付き:MariaDBで結合テーブルに基づいて行を更新する
MariaDBで結合テーブルに基づいて行を更新する方法
例
以下の例では、customers
テーブルとorders
テーブルを結合して、orders
テーブルのcustomer_id
に基づいてcustomers
テーブルのemail
列を更新する方法を示します。
UPDATE customers
INNER JOIN orders ON customers.id = orders.customer_id
SET customers.email = '[email protected]'
WHERE orders.id = 1;
このクエリは、orders
テーブルのid
が1である行のcustomer_id
を取得します。次に、そのcustomer_id
を使用して、customers
テーブルの対応する行を見つけ、email
列を[email protected]
に更新します。
詳細
UPDATE
ステートメントは、テーブル内の行を更新するために使用されます。JOIN
句は、複数のテーブルからデータを結合するために使用されます。INNER JOIN
は、両方のテーブルに一致する行のみを返します。WHERE
句は、更新する行をフィルタリングするために使用されます。
- 特定の条件に基づいて複数の列を更新するには、
SET
句でカンマを使用して列を区切ることができます。 WHERE
句で複数の条件を指定するには、AND
またはOR
演算子を使用できます。
注意
- 結合テーブルに基づいて行を更新する際には、正しいテーブルと列を結合していることを確認する必要があります。
WHERE
句を使用して、更新する行を正しくフィルタリングしていることを確認する必要があります。
# customersテーブルとordersテーブルのスキーマ
CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(255),
email VARCHAR(255)
);
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT,
order_date DATETIME
);
# サンプルデータ
INSERT INTO customers (name, email) VALUES ('John Doe', '[email protected]');
INSERT INTO customers (name, email) VALUES ('Jane Doe', '[email protected]');
INSERT INTO orders (customer_id, order_date) VALUES (1, '2023-11-14');
INSERT INTO orders (customer_id, order_date) VALUES (2, '2023-12-01');
# John Doeのメールアドレスを更新
UPDATE customers
INNER JOIN orders ON customers.id = orders.customer_id
SET customers.email = '[email protected]'
WHERE orders.id = 1;
# 結果
SELECT * FROM customers;
# 結果:
# id | name | email
# -- | -- | --
# 1 | John Doe | newemail@example.com
# 2 | Jane Doe | janedoe@example.com
このサンプルコードを実行すると、customers
テーブルのJohn Doe
のemail
列が[email protected]
に更新されます。
MariaDBで結合テーブルに基づいて行を更新する他の方法
サブクエリを使用して、更新する行のIDを取得してから、そのIDを使用してUPDATE
ステートメントを実行することができます。
UPDATE customers
SET email = (
SELECT email
FROM orders
WHERE orders.customer_id = customers.id
AND orders.id = 1
);
CASE
式を使用して、更新する行の値に基づいて列を更新することができます。
UPDATE customers
SET email = CASE orders.id
WHEN 1 THEN '[email protected]'
ELSE customers.email
END
WHERE orders.customer_id = customers.id;
トリガーを使用して、特定の条件が満たされたときに自動的に行を更新することができます。
CREATE TRIGGER update_customer_email
AFTER UPDATE ON orders
FOR EACH ROW
BEGIN
UPDATE customers
SET email = NEW.email
WHERE customers.id = OLD.customer_id;
END;
このトリガーは、orders
テーブルのemail
列が更新されたときに実行されます。トリガーは、customers
テーブルの対応する行のemail
列を新しいemail
値に更新します。
- サブクエリは、単純な更新操作に適しています。
CASE
式は、複数の条件に基づいて行を更新する必要がある場合に適しています。
パフォーマンスが重要な場合は、UPDATE
ステートメントとJOIN
句を使用するのが最良の方法です。
sql mariadb