シェア

はじめに

多くのデータベーステーブルは、時々変更または更新する必要があるデータを管理しています。SQLのUPDATEコマンドは、テーブル内のレコードに格納されている値を変更できるようにすることで、このような状況で役立ちます。

レコードを更新するには、変更が発生する列とその新しい値を指定する必要があります。MySQLにどのレコードをターゲットにするかを指示するには、どの行を変更するかを決定できるように、一致条件も指定する必要があります。この記事では、UPDATEを使用してテーブルデータの値を一度に1つずつ、または一括で変更する方法について説明します。

UPDATEを使用してデータを変更する

UPDATEコマンドの基本的な構文は次のようになります

UPDATE <table>
SET
<column1> = <value1>,
<column2> = <value2>
WHERE
<match_condition>;

上記のように、基本的な構造は3つの独立した句で構成されています

  • 操作対象のテーブルを指定すること、
  • 更新したい列とその新しい値を提供すること、そして
  • 一致させるレコードを決定するための条件を定義すること

正常にコミットされると、MySQLは一致および変更された行数を出力してアクションを確認します

Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

別のテーブルの値に基づいてレコードを更新する

新しい外部データを提供することに基づく更新は比較的簡単です。テーブル、列、新しい値、およびターゲティング条件を提供するだけで済みます。

ただし、UPDATEを使用して、JOINされたテーブルに格納されている情報に基づいて、条件付きでテーブル値を更新することもできます。基本的な構文は次のようになります

UPDATE <table1>, <table2>
SET <table1>.<column1> = <table2>.<column1>
WHERE <table1>.<column2> = <table2>.<column2>;

ここでは、table1テーブルのcolumn1の値をtable2column1に格納されている値に更新していますが、table1column2table2column2と一致する行のみです。値が1つのテーブルでのみ変更されている場合でも、UPDATEが操作するテーブルのリストに両方のテーブルを追加する必要があります。WHERE構造は、2つのテーブルを統合するための結合条件を指定します。

例として、filmとdirectorという2つのテーブルがあると仮定します。

CREATE TABLE director (
id SERIAL PRIMARY KEY,
name VARCHAR(200) NOT NULL,
latest_film VARCHAR(200)
);
CREATE TABLE film (
id SERIAL PRIMARY KEY,
title VARCHAR(200) NOT NULL,
director_id INT REFERENCES director(id),
release_date DATE NOT NULL
);
INSERT INTO director (name)
VALUES
('frank'),
('bob'),
('sue');
INSERT INTO film (title, director_id, release_date)
VALUES
('first movie', 1, '2010-08-24'),
('second movie', 1, '2010-12-15'),
('third movie', 2, '2011-01-01'),
('fourth movie', 2, '2012-08-02');

これらの2つのテーブルは、film.director_iddirector.idを参照する関係を持っています。現在、directorテーブルのlatest_filmNULLです。ただし、WHERE句を使用して2つのテーブルを結合することで、ディレクターの最新の映画タイトルを入力できます。

ここでは、WITH句を使用して、UPDATEステートメントで参照できるlatest_filmsという共通テーブル式(CTE)を作成します。

WITH latest_films AS (
SELECT
f1.*
FROM
film f1
WHERE
f1.id = (SELECT
f2.id
FROM
film f2
WHERE
f2.director_id = f1.director_id
ORDER BY f2.release_date DESC LIMIT 1))
UPDATE
director, latest_films
SET
director.latest_film = latest_films.title
WHERE
director.id = latest_films.director_id;

directorテーブルをクエリすると、各ディレクターの最新の映画が現在表示されるはずです

SELECT * FROM director;
+----+-------+--------------+
id | name | latest_film |
+----+-------+--------------+
1 | frank | second movie |
2 | bob | fourth movie |
3 | sue | NULL |
+----+-------+--------------+
3 rows in set (0.00 sec)

結論

この記事では、UPDATEコマンドを使用して既存のMySQLレコードの値を変更する方法を説明しました。UPDATEコマンドは、他のSQL構文と組み合わせると非常に柔軟になり、データベース全体で見つかった条件と値に応じて、興味深い方法でデータを変更できます。操作に慣れるにつれて、要件に合わせてデータを変更する新しい方法を見つけることができるようになります。

著者について
Justin Ellingwood

Justin Ellingwood

Justinは2013年からデータベース、Linux、インフラストラクチャ、および開発者ツールについて執筆しています。現在、妻と2匹のウサギと一緒にベルリンに住んでいます。彼は通常、三人称で書く必要はありません。これは関係者全員にとって安心です。