はじめに
多くのデータベーステーブルは、時間の経過とともに変更または更新が必要となるデータを管理しています。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
Prisma Clientでデータを更新するには、更新クエリを発行します。
別のテーブルの値に基づくレコードの更新
新しい外部データを提供するに基づく更新は、比較的簡単です。テーブル、列、新しい値、およびターゲット条件を指定するだけで済みます。
ただし、UPDATE
を使用して、結合されたテーブルに保存されている情報に基づいてテーブル値を条件付きで更新することもできます。基本的な構文は次のようになります
UPDATE <table1>, <table2>SET <table1>.<column1> = <table2>.<column1>WHERE <table1>.<column2> = <table2>.<column2>;
ここでは、table1
テーブルのcolumn1
の値をtable2
のcolumn1
に保存されている値に更新していますが、これはtable1
のcolumn2
がtable2
のcolumn2
と一致する行のみです。値は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_id
がdirector.id
を参照する関係を持っています。現在、director
テーブルのlatest_film
はNULL
です。しかし、WHERE
句を使用して2つのテーブルを結合し、監督の最新映画のタイトルでこれを埋めることができます。
ここでは、WITH
句を使用して、UPDATE
ステートメントで参照できるlatest_films
という共通テーブル式 (CTE) を作成します
WITH latest_films AS (SELECTf1.*FROMfilm f1WHEREf1.id = (SELECTf2.idFROMfilm f2WHEREf2.director_id = f1.director_idORDER BY f2.release_date DESC LIMIT 1))UPDATEdirector, latest_filmsSETdirector.latest_film = latest_films.titleWHEREdirector.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構文と組み合わせることで非常に柔軟になり、データベース全体で見つかる条件や値に応じてデータを興味深い方法で変更できます。この操作に慣れるにつれて、要件に合わせてデータを変更する新しい方法を見つけられるようになるでしょう。