PostgreSQL / データの挿入と変更
PostgreSQLで既存のデータを更新する方法
はじめに
データベースに保存されているレコードは、多くの場合静的ではありません。関連性を維持するためには、それらが表すシステムの変化を反映するように更新する必要があります。PostgreSQLでは、UPDATE
SQLコマンドを使用してレコードの値を変更できます。
多くの点で、UPDATE
はINSERT
(列とその目的の値を指定するという点で)およびDELETE
(特定のレコードをターゲットにするために必要な基準を提供するという点で)と同様に機能します。テーブルの任意の列のデータを、一度に1つずつ、またはまとめて変更できます。このガイドでは、このコマンドを効果的に使用して、テーブルに既にあるデータを管理する方法を探ります。
UPDATE
を使用してデータを変更する
UPDATE
コマンドの基本的な構文は次のようになります
UPDATE my_tableSETcolumn1 = value1,column2 = value2WHEREid = 1;
上記のように、基本的な構造には3つの別々の句が含まれています
上記の基本テンプレートでは、列に値を直接割り当てるスタイルを示しました。INSERT
コマンドでよく見られるように、列リスト構文も使用できます。
たとえば、上記の例は次のように指定することもできます
UPDATE my_tableSET (column1, column2) =(value1, value2)WHEREid = 1;
正常にコミットされると、PostgreSQLは操作の名前と影響を受けた行数を出力してアクションを確認します
UPDATE <count>
Prisma Clientでデータを更新するには、updateクエリを発行します。
UPDATE
コマンドによって変更されたレコードを返す
他の多くのコマンドと同様に、PostgreSQLでは、RETURNING
句をUPDATE
コマンドに追加できます。これにより、コマンドは変更されたレコードのすべてまたは一部を返します。
アスタリスク*
記号を使用して、変更された行のすべての列を返すことができます
UPDATE my_tableSETcolumn1 = value1,column2 = value2WHEREid = 1RETURNING *;
または、特定の属性のみを表示するために、関心のある正確な列を指定することもできます
UPDATE my_tableSETcolumn1 = value1,column2 = value2WHEREid = 1RETURNING column1 AS 'first column';
ここでは、列エイリアスを使用して、出力の列ヘッダーのラベルを設定しました。
別のテーブルの値に基づいてレコードを更新する
新しい外部データを提供することに基づく更新は比較的簡単です。テーブル、列、新しい値、およびターゲティング基準を指定するだけです。
ただし、UPDATE
を使用して、結合されたテーブルに格納されている情報に基づいてテーブル値を条件付きで更新することもできます。基本的な構文は次のようになります
UPDATE table1SET table1.column1 = <some_value>FROM table2WHERE table1.column2 = table2.column2;
ここで、table1
テーブルのcolumn1
の値を<some_value>
に更新していますが、table1
のcolumn2
がtable2
のcolumn2
と一致する行のみです。FROM
句は2つのテーブル間の結合を示し、WHERE
構造は結合条件を指定します。
例として、film
とdirector
という2つのテーブルがあるとします。
CREATE TABLE director (id SERIAL PRIMARY KEY,name TEXT NOT NULL,latest_film TEXT);CREATE TABLE film (id SERIAL PRIMARY KEY,title TEXT 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
です。ただし、FROM
句とWHERE
句を使用して2つのテーブルを結合することで、ディレクターの最新の映画タイトルを入力できます。
ここでは、WITH
句を使用して、UPDATE
ステートメントで参照できるCommon Table Expression(CTE)であるlatest_films
を作成します
WITH latest_films AS (SELECT DISTINCT ON (director_id)*FROMfilmORDER BYdirector_id,release_date DESC)UPDATE director set latest_film = title FROM latest_filmsWHERE director.id = latest_films.director_id;
director
テーブルをクエリすると、各ディレクターの最新の映画が現在表示されるはずです
SELECT * FROM director;
id | name | latest_film----+-------+--------------3 | sue |1 | frank | second movie2 | bob | fourth movie(3 rows)
結論
このガイドでは、UPDATE
コマンドを使用してテーブル内の既存のデータを変更する基本的な方法を見てきました。これらの基本的な概念を使用すると、テーブル内の既存の行を識別し、列名を新しい値で更新し、オプションで影響を受けた行を返すために必要な正確な基準を指定できます。UPDATE
コマンドは、データが最初にデータベースに取り込まれた後でデータを管理するために不可欠です。