はじめに
テーブルへのレコードの追加と削除は、データベースが実行する最も一般的な操作の一部です。データの追加には、値を追加するテーブルと列の名前、および各フィールドに入力する値を指定する必要があります。レコードの削除には、正しい行を特定してテーブルから削除する必要があります。
このガイドでは、PostgreSQLでSQLのINSERT
コマンドとDELETE
コマンドを使用する方法について説明します。これには、基本的な構文、処理されたデータに関するデータ情報を返す方法、および単一のステートメントで複数行を追加または削除する方法が含まれます。
テーブル構造の確認
INSERT
コマンドを使用する前に、テーブルのデータ型と制約、列によって課せられる要件に対応できるように、テーブルの構造を知っておく必要があります。データベースクライアントに応じて、これを行うにはいくつかの異なる方法があります。
psql
コマンドラインクライアントを使用している場合、この情報を見つける最も簡単な方法は、ツールに組み込まれている\d+
メタコマンドを使用することです。
たとえば、employee
というテーブルの構造を見つけるには、次のように入力します。
\d+ employee
Table "public.employee"Column | Type | Collation | Nullable | Default | Storage | Stats target | Description-------------+-----------------------------+-----------+----------+-----------------------------------------------+----------+--------------+-------------employee_id | integer | | not null | nextval('employee_employee_id_seq'::regclass) | plain | |first_name | character varying(45) | | not null | | extended | |last_name | character varying(45) | | not null | | extended | |last_update | timestamp without time zone | | not null | now() | plain | |Indexes:"employee_pkey" PRIMARY KEY, btree (employee_id)"idx_employee_last_name" btree (last_name)Triggers:last_updated BEFORE UPDATE ON employee FOR EACH ROW EXECUTE FUNCTION last_updated()Access method: heap
出力には、テーブルの列名、データ型、デフォルト値などが表示されます。
\d+
メタコマンドはpsql
クライアントでのみ使用できるため、別のクライアントを使用している場合は、テーブル情報を直接クエリする必要がある場合があります。次のようなクエリを使用すると、関連する情報のほとんどを取得できます。
SELECT column_name, data_type, column_default, is_nullable, character_maximum_lengthFROM information_schema.columns WHERE table_name ='employee';
column_name | data_type | column_default | is_nullable | character_maximum_length-------------+-----------------------------+-----------------------------------------------+-------------+--------------------------employee_id | integer | nextval('employee_employee_id_seq'::regclass) | NO |first_name | character varying | | NO | 45last_name | character varying | | NO | 45last_update | timestamp without time zone | now() | NO |(4 rows)
これらは、値を正しく挿入できるように、テーブル構造の良いアイデアを提供する必要があります。
INSERT
を使用してテーブルに新しいレコードを追加する
SQLのINSERT
コマンドは、既存のテーブルに行データを追加するために使用されます。テーブルの構造がわかったら、テーブルの列を、新しいレコードに挿入する対応する値と一致させるコマンドを作成できます。
コマンドの基本的な構文は次のようになります。
INSERT INTO my_table(column1, column2)VALUES ('value1', 'value2');
列リストの列は、値リストで提供される値に直接対応します。
デフォルトでは、INSERT
コマンドはオブジェクトID(通常は0)と、正常に挿入された行数を返します。
INSERT 0 1
例として、上記のemployee
テーブルに新しい従業員を挿入するには、次のように入力します。
INSERT INTO employee(first_name, last_name)VALUES ('Bob', 'Smith');
INSERT 0 1
ここでは、first_name
列とlast_name
列の値を提供し、他の列はデフォルト値で入力されるようにします。テーブルをクエリすると、新しいレコードが追加されていることがわかります。
SELECT * FROM employee;
employee_id | first_name | last_name | last_update-------------+------------+-----------+----------------------------1 | Bob | Smith | 2020-08-19 21:07:00.952454(1 row)
Prisma Clientを使用して、create queryを発行してテーブルにデータを追加することもできます。
INSERT
ステートメントからデータを返す
テーブルに追加されたデータに関する追加情報が必要な場合は、ステートメントの最後にRETURNING
句を含めることができます。RETURNING
句は、挿入されたばかりのレコードの表示する列を指定します。
たとえば、挿入されたばかりのレコードのすべての列を表示するには、次のように入力します。
INSERT INTO my_table(column_name, column_name_2)VALUES ('value', 'value2')RETURNING *;
column_name | column_name_2-------------+---------------value | value2(1 row)INSERT 0 1
employee
テーブルを使用すると、次のようになります。
INSERT INTO employee(first_name, last_name)VALUES ('Sue', 'Berns')RETURNING *;
employee_id | first_name | last_name | last_update-------------+------------+-----------+--------------------------2 | Sue | Berns | 2020-08-19 21:15:01.7622(1 row)INSERT 0 1
挿入から特定の列のみを返すこともできます。たとえば、ここでは、新しい従業員のIDのみに関心があります。
INSERT INTO employee(first_name, last_name)VALUES ('Delores', 'Muniz')RETURNING employee_id;
employee_id-------------3(1 row)INSERT 0 1
通常どおり、列エイリアスを使用して出力の列名を変更することもできます。
INSERT INTO employee(first_name, last_name)VALUES ('Simone', 'Kohler')RETURNING employee_id AS "Employee ID";
Employee ID-------------4(1 row)INSERT 0 1
INSERT
を使用して一度に複数の行を追加する
レコードを1つのステートメントずつ挿入するよりも、一度に複数行を挿入する方が時間がかからず効率的です。PostgreSQLでは、同じテーブルに追加する複数の行を指定できます。新しい各行は括弧で囲まれ、括弧の各セットはカンマで区切られます。
複数レコード挿入の基本的な構文は次のようになります。
INSERT INTO my_table(column_name, column_name_2)VALUES('value', 'value2'),('value3', 'value4'),('value5', 'value6');
参照しているemployee
テーブルの場合、次の入力をタイプすることで、1つのステートメントで4人の新しい従業員を追加できます。
INSERT INTO employee(first_name, last_name)VALUES('Abigail', 'Spencer'),('Tamal', 'Wayne'),('Katie', 'Singh'),('Felipe', 'Espinosa');
INSERT 0 4
DELETE
を使用してテーブルから行を削除する
SQLのDELETE
コマンドは、INSERT
の補完的なアクションとして機能し、テーブルから行を削除するために使用されます。テーブルから行を削除するには、WHERE
句内に一致基準を指定して、ターゲットにする行を識別する必要があります。
基本的な構文は次のようになります。
DELETE FROM my_tableWHERE <condition>;
たとえば、first_name
がAbigail
に設定されているemployee
テーブルのすべての行に対して、次のように入力できます。
DELETE FROM employeeWHERE first_name = 'Abigail';
DELETE 1
ここでの戻り値は、DELETE
コマンドが処理され、1行が削除されたことを示しています。
Prisma Clientを使用してテーブルからデータを削除するには、delete queryを使用します。
DELETE
ステートメントからデータを返す
INSERT
コマンドと同様に、RETURNING
句を追加することで、影響を受けた行または削除された行から特定の列を返すことができます。
DELETE FROM my_tableWHERE <condition>RETURNING *;
たとえば、ここで削除されたemployee
からすべての列を返すことで、正しいレコードが削除されたことを確認できます。
DELETE FROM employeeWHERE last_name = 'Smith'RETURNING *;
employee_id | first_name | last_name | last_update-------------+------------+-----------+----------------------------1 | Bob | Smith | 2020-08-19 21:07:00.952454(1 row)DELETE 1
DELETE
を使用して一度に複数の行を削除する
WHERE
句で指定された選択基準を操作することにより、DELETE
で一度に複数のアイテムを削除できます。
たとえば、IDで複数行を削除するには、次のように入力できます。
DELETE FROM employeeWHERE employee_id in (3,4)RETURNING *;
employee_id | first_name | last_name | last_update-------------+------------+-----------+----------------------------3 | Delores | Muniz | 2020-08-19 21:17:06.9436084 | Simone | Kohler | 2020-08-19 21:19:19.298833(2 rows)DELETE 2
WHERE
句を省略して、特定のテーブルからすべての行を削除することもできます。
DELETE FROM employeeRETURNING *;
employee_id | first_name | last_name | last_update-------------+------------+-----------+----------------------------2 | Sue | Berns | 2020-08-19 21:15:01.76226 | Tamal | Wayne | 2020-08-19 22:11:53.4085317 | Katie | Singh | 2020-08-19 22:11:53.4085318 | Filipe | Espinosa | 2020-08-19 22:11:53.408531(4 rows)DELETE 4
ただし、DELETE
を使用してテーブルのデータを空にすることは、TRUNCATE
コマンドほど効率的ではありません。これは、テーブルをスキャンせずにデータを削除できます。
Prisma Clientは、一度に複数行のデータを削除するために、deleteManyと呼ばれる別のクエリを使用します。
結論
この記事では、PostgreSQLテーブルのデータを制御するための最も重要なコマンドのいくつかを紹介しました。INSERT
コマンドはテーブルに新しいデータを追加するために使用でき、DELETE
コマンドは削除する必要のある行を指定します。どちらのコマンドも、影響を与える行を返すことができ、一度に複数行を操作できます。
これら2つのコマンドは、テーブルに含まれるレコード数を増減するために使用される主要なメカニズムです。基本的な構文と、他の句と組み合わせることができる方法を理解することで、必要に応じてテーブルにデータを入力およびクリーンアップできます。
FAQ
複数レコード挿入の基本的な構文は次のようになります。
INSERT INTO my_table(column_name, column_name_2)VALUES('value', 'value2'),('value3', 'value4'),('value5', 'value6');
従業員データを使用した例は次のようになります。
INSERT INTO employee(first_name, last_name)VALUES('Abigail', 'Spencer'),('Tamal', 'Wayne'),('Katie', 'Singh'),('Felipe', 'Espinosa');
PostgreSQLで挿入する前にレコードが存在するかどうかを確認する1つの方法は、EXISTS
サブクエリ式を使用することです。
EXISTS
条件は、チェックしているデータのサブクエリと組み合わせて使用されます。サブクエリが少なくとも1行を返す場合は満たされていると見なされます。行が返されない場合、レコードはまだ存在しません。
基本的な構文は次のようになります。
WHERE EXISTS ( subquery );
PostgreSQLで重複行を削除する方法はいくつかあります。DELETE USING
ステートメントを使用して、2つの異なる行が同じ値を持っているかどうかを確認し、重複を削除できます。
さらに、サブクエリを使用して重複を削除したり、リストされた手順で即時テーブルを使用したりできます。
- 重複行を削除する必要があるものと同じ構造で新しいテーブルを作成します。
- ソーステーブルから即時テーブルに個別の行を挿入します。
- ソーステーブルをドロップします。
- 即時テーブルの名前をソーステーブルの名前に変更します。
PostgreSQLでレコードが存在する場合に削除するには、EXISTS
を含むWHERE
句を持つDELETE
ステートメントを使用します。EXISTS
句にはサブクエリが必要です。
基本的な構文は次のようになります。
DELETE FROM table_nameWHERE EXISTS ( subquery );
PostgreSQLでは、SELECT
ステートメントでのみLIMIT
句を使用できます。したがって、DELETE
ステートメントで使用するには、SELECT
を含める必要があります。
構文は次のようになります。
DELETE FROM table_nameWHERE field_name IN (SELECT field_name FROM table_name LIMIT 1);