PostgreSQLはすべてのコンテンツを削除します


回答:



112

PostgreSQLデータベースのテーブル/テーブルのコンテンツは、いくつかの方法で削除できます。

SQLを使用したテーブルコンテンツの削除:

1つのテーブルのコンテンツを削除する:

TRUNCATE table_name;
DELETE FROM table_name;

すべての名前付きテーブルのコンテンツを削除します:

TRUNCATE table_a, table_b, …, table_z;

名前付きテーブルとそれらを参照するテーブルのコンテンツの削除(この回答の後半で詳しく説明します):

TRUNCATE table_a, table_b CASCADE;

pgAdminを使用したテーブルコンテンツの削除:

1つのテーブルのコンテンツを削除する:

Right click on the table -> Truncate

テーブルとそれを参照するテーブルのコンテンツを削除する:

Right click on the table -> Truncate Cascaded

削除と切り捨ての違い:

ドキュメントから:

DELETEは、WHERE句を満たす行を指定されたテーブルから削除します。WHERE句がない場合は、テーブル内のすべての行が削除されます。 http://www.postgresql.org/docs/9.3/static/sql-delete.html

TRUNCATEは、テーブルからすべての行を削除するためのより高速なメカニズムを提供するPostgreSQLの拡張機能です。TRUNCATEは、一連のテーブルからすべての行をすばやく削除します。各テーブルで非修飾DELETEと同じ効果がありますが、実際にはテーブルをスキャンしないため、高速です。さらに、後続のVACUUM操作を必要とせずに、ディスク領域をすぐに再利用します。これは、大きなテーブルで最も役立ちます。 http://www.postgresql.org/docs/9.1/static/sql-truncate.html

他のテーブルから参照されているテーブルの操作:

複数のテーブルを持つデータベースがある場合、テーブルにはおそらく関係があります。例として、3つのテーブルがあります。

create table customers (
customer_id int not null,
name varchar(20),
surname varchar(30),
constraint pk_customer primary key (customer_id)
);

create table orders (
order_id int not null,
number int not null,
customer_id int not null,
constraint pk_order primary key (order_id),
constraint fk_customer foreign key (customer_id) references customers(customer_id)
);

create table loyalty_cards (
card_id int not null,
card_number varchar(10) not null,
customer_id int not null,
constraint pk_card primary key (card_id),
constraint fk_customer foreign key (customer_id) references customers(customer_id)
);

そして、これらのテーブルのいくつかの準備されたデータ:

insert into customers values (1, 'John', 'Smith');

insert into orders values 
(10, 1000, 1),
(11, 1009, 1),
(12, 1010, 1);        

insert into loyalty_cards values (100, 'A123456789', 1);

テーブル注文はテーブル顧客を参照し、テーブルloyalty_cardsはテーブル顧客を参照します。他のテーブルから参照されているテーブルをTRUNCATE / DELETEしようとすると(他のテーブルには指定されたテーブルへの外部キー制約があります)、エラーが発生します。3つのテーブルすべてからコンテンツを削除するには、これらすべてのテーブルに名前を付ける必要があります(順序は重要ではありません)。

TRUNCATE customers, loyalty_cards, orders;

または、CASCADEキーワードで参照されるテーブルのみ(1つだけではなく、より多くのテーブルに名前を付けることができます)

TRUNCATE customers CASCADE;

同じことがpgAdminにも当てはまります。Customersテーブルを右クリックして、Truncate Cascadedを選択します。


TRUNCATEANSI SQLの一部であり、すべての DBMSでサポートされています。私はリンクをたどりました、そして、ドキュメントは拡張について何も述べていません。おそらくリンクが正しくないか、古くなっていますか?
Manngo 2018

うーん、面白い。引用されたテキストはまだpostgresql.org/docs/9.0/static/sql-delete.htmlにありますが、あなたの言うとおりです-9.1のドキュメントにはありません。
vitfo 2018

34

以下のために小さなテーブルDELETE速いことが多いです(重い同時負荷のために)あまり積極的で、ロックを必要とします:

DELETE FROM tbl;

WHERE状態なし。

以下のために媒体や大きなテーブル、一緒に行くTRUNCATE tbl@グレッグ投稿のように、。


5
「推定による」「小さい」、「中」、「大きい」とは何ですか?
ジャクソン

3
@Jackson:あまりにも多くの変数に依存しているため、正確に特定するのは困難です。いくつかのテストを実行して、システムのスイートスポットを見つけることができます。
Erwin Brandstetter 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.