はじめに
多くのデータベーステーブルは、時々変更または更新する必要があるデータを管理しています。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
Prisma Clientでデータを更新するには、update queryを発行します。
別のテーブルの値に基づいてレコードを更新する
新しい外部データを提供することに基づく更新は比較的簡単です。テーブル、列、新しい値、およびターゲティング条件を提供するだけで済みます。
ただし、UPDATE
を使用して、JOINされたテーブルに格納されている情報に基づいて、条件付きでテーブル値を更新することもできます。基本的な構文は次のようになります
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構文と組み合わせると非常に柔軟になり、データベース全体で見つかった条件と値に応じて、興味深い方法でデータを変更できます。操作に慣れるにつれて、要件に合わせてデータを変更する新しい方法を見つけることができるようになります。