PostgreSQL은 모든 콘텐츠를 삭제합니다.


답변:



114

PostgreSQL 데이터베이스의 테이블 / 테이블 내용은 여러 가지 방법으로 삭제할 수 있습니다.

SQL을 사용하여 테이블 콘텐츠 삭제 :

한 테이블의 내용 삭제 :

TRUNCATE table_name;
DELETE FROM table_name;

모든 명명 된 테이블의 내용 삭제 :

TRUNCATE table_a, table_b, …, table_z;

명명 된 테이블 및 테이블을 참조하는 테이블의 내용 삭제 (이 답변의 뒷부분에서 자세히 설명합니다) :

TRUNCATE table_a, table_b CASCADE;

pgAdmin을 사용하여 테이블 콘텐츠 삭제 :

한 테이블의 내용 삭제 :

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

다른 테이블에서 참조되는 테이블 작업 :

둘 이상의 테이블이있는 데이터베이스가있는 경우 테이블은 관계가있을 수 있습니다. 예를 들어 세 개의 테이블이 있습니다.

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를 시도하면 (다른 테이블에 명명 된 테이블에 대한 외래 키 제약 조건이 있음) 오류가 발생합니다. 세 테이블 모두에서 콘텐츠를 삭제하려면이 모든 테이블의 이름을 지정해야합니다 (순서는 중요하지 않음).

TRUNCATE customers, loyalty_cards, orders;

또는 CASCADE 키워드로 참조되는 테이블 만 (하나 이상의 테이블 이름을 지정할 수 있음)

TRUNCATE customers CASCADE;

pgAdmin에도 동일하게 적용됩니다. customers 테이블을 마우스 오른쪽 버튼으로 클릭하고 Truncate Cascaded를 선택하십시오.


TRUNCATEANSI SQL의 일부이며 모든 DBMS 에서 지원됩니다 . 나는 링크를 따라 갔고 문서는 확장에 대해 언급하지 않았습니다. 링크가 잘못되었거나 오래 되었나요?
Manngo

흠, 흥미 롭군요. : 인용 된 텍스트는 여전히 여기에 볼 수 있습니다 postgresql.org/docs/9.0/static/sql-delete.html 하지만 당신은 맞다 - 그것은 9.1 문서에 있지 않습니다.
vitfo

34

들어 작은 테이블 DELETE빠른 자주와 (무거운 동시 부하) 덜 공격적 잠금이 필요합니다 :

DELETE FROM tbl;

WHERE조건 없이 .

들어 중간 또는 큰 테이블로 이동 TRUNCATE tbl@Greg 게시처럼.


5
"작음", "중간"및 "크게"(귀하의 추정치)는 무엇입니까?
Jackson

3
@Jackson : 너무 많은 변수에 의존하기 때문에 정확히 파악하기가 어렵습니다. 몇 가지 테스트를 실행하여 시스템에서 최적의 지점을 찾을 수 있습니다.
Erwin Brandstetter 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.