シェア

はじめに

データベースに保存されているレコードは、多くの場合静的ではありません。関連性を維持するためには、それらが表すシステムの変化を反映するように更新する必要があります。PostgreSQLでは、UPDATE SQLコマンドを使用してレコードの値を変更できます。

多くの点で、UPDATEINSERT(列とその目的の値を指定するという点で)およびDELETE(特定のレコードをターゲットにするために必要な基準を提供するという点で)と同様に機能します。テーブルの任意の列のデータを、一度に1つずつ、またはまとめて変更できます。このガイドでは、このコマンドを効果的に使用して、テーブルに既にあるデータを管理する方法を探ります。

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

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

UPDATE my_table
SET
column1 = value1,
column2 = value2
WHERE
id = 1;

上記のように、基本的な構造には3つの別々の句が含まれています

  • 操作対象のテーブルを指定し、
  • 更新したいとそれらの新しい値を指定し、
  • PostgreSQLが一致するレコードを決定するために評価する必要がある基準を定義します

上記の基本テンプレートでは、列に値を直接割り当てるスタイルを示しました。INSERTコマンドでよく見られるように、列リスト構文も使用できます。

たとえば、上記の例は次のように指定することもできます

UPDATE my_table
SET (column1, column2) =
(value1, value2)
WHERE
id = 1;

正常にコミットされると、PostgreSQLは操作の名前と影響を受けた行数を出力してアクションを確認します

UPDATE <count>

UPDATEコマンドによって変更されたレコードを返す

他の多くのコマンドと同様に、PostgreSQLでは、RETURNING句をUPDATEコマンドに追加できます。これにより、コマンドは変更されたレコードのすべてまたは一部を返します。

アスタリスク*記号を使用して、変更された行のすべての列を返すことができます

UPDATE my_table
SET
column1 = value1,
column2 = value2
WHERE
id = 1
RETURNING *;

または、特定の属性のみを表示するために、関心のある正確な列を指定することもできます

UPDATE my_table
SET
column1 = value1,
column2 = value2
WHERE
id = 1
RETURNING column1 AS 'first column';

ここでは、列エイリアスを使用して、出力の列ヘッダーのラベルを設定しました。

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

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

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

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

ここで、table1テーブルのcolumn1の値を<some_value>に更新していますが、table1column2table2column2と一致する行のみです。FROM句は2つのテーブル間の結合を示し、WHERE構造は結合条件を指定します。

例として、filmdirectorという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_iddirector.idを参照する関係があります。現在、directorテーブルのlatest_filmNULLです。ただし、FROM句とWHERE句を使用して2つのテーブルを結合することで、ディレクターの最新の映画タイトルを入力できます。

ここでは、WITH句を使用して、UPDATEステートメントで参照できるCommon Table Expression(CTE)であるlatest_filmsを作成します

WITH latest_films AS (
SELECT DISTINCT ON (director_id)
*
FROM
film
ORDER BY
director_id,
release_date DESC)
UPDATE director set latest_film = title FROM latest_films
WHERE director.id = latest_films.director_id;

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

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

結論

このガイドでは、UPDATEコマンドを使用してテーブル内の既存のデータを変更する基本的な方法を見てきました。これらの基本的な概念を使用すると、テーブル内の既存の行を識別し、列名を新しい値で更新し、オプションで影響を受けた行を返すために必要な正確な基準を指定できます。UPDATEコマンドは、データが最初にデータベースに取り込まれた後でデータを管理するために不可欠です。

著者について
Justin Ellingwood

Justin Ellingwood

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