共有

はじめに

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

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

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を使用して、結合されたテーブルに保存されている情報に基づいてテーブル値を条件付きで更新することもできます。基本的な構文は次のようになります

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

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

例として、filmdirectorという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

ジャスティン・エリングウッド

ジャスティンは2013年以来、データベース、Linux、インフラ、開発者ツールについて執筆しています。現在はベルリンで妻と2匹のウサギと暮らしています。彼は通常、三人称で書く必要がないため、関係者全員にとって安心です。
© . All rights reserved.