173

こんにちは私はpostgresqlテーブルのすべてのデータを削除したいのですが、テーブル自体は削除しません。どうすればこれを行うことができますか?

4

4 に答える 4

196

コマンドを使用しTRUNCATE TABLEます。

于 2012-11-04T22:55:50.973 に答える
156

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);

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

TRUNCATE customers, loyalty_cards, orders;

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

TRUNCATE customers CASCADE;

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

于 2014-08-07T13:31:03.777 に答える
47

小さなテーブルの場合DELETEは、多くの場合より高速であり、積極的なロックが少なくて済みます (同時負荷が大きい場合):

DELETE FROM tbl;

無条件WHEREで。

中規模以上のテーブルの場合は、@Greg が投稿したTRUNCATE tblように を使用してください。

于 2012-11-05T05:10:51.807 に答える