PostgreSQL xóa tất cả nội dung


Câu trả lời:



113

Nội dung của bảng / bảng trong cơ sở dữ liệu PostgreSQL có thể bị xóa theo một số cách.

Xóa nội dung bảng bằng sql:

Xóa nội dung của một bảng:

TRUNCATE table_name;
DELETE FROM table_name;

Xóa nội dung của tất cả các bảng đã đặt tên:

TRUNCATE table_a, table_b, …, table_z;

Xóa nội dung của các bảng đã đặt tên và các bảng tham chiếu đến chúng (tôi sẽ giải thích chi tiết hơn ở phần sau trong câu trả lời này):

TRUNCATE table_a, table_b CASCADE;

Xóa nội dung bảng bằng pgAdmin:

Xóa nội dung của một bảng:

Right click on the table -> Truncate

Xóa nội dung của bảng và các bảng tham chiếu đến nó:

Right click on the table -> Truncate Cascaded

Sự khác biệt giữa xóa và cắt ngắn:

Từ tài liệu:

DELETE xóa các hàng thỏa mãn mệnh đề WHERE khỏi bảng được chỉ định. Nếu mệnh đề WHERE vắng mặt, tác dụng là xóa tất cả các hàng trong bảng. http://www.postgresql.org/docs/9.3/static/sql-delete.html

TRUNCATE là một phần mở rộng PostgreSQL cung cấp cơ chế nhanh hơn để xóa tất cả các hàng khỏi bảng. TRUNCATE nhanh chóng xóa tất cả các hàng khỏi một tập hợp các bảng. Nó có tác dụng tương tự như XÓA không đủ tiêu chuẩn trên mỗi bảng, nhưng vì nó không thực sự quét các bảng nên nhanh hơn. Hơn nữa, nó lấy lại không gian đĩa ngay lập tức, thay vì yêu cầu một hoạt động VACUUM tiếp theo. Điều này hữu ích nhất trên các bảng lớn. http://www.postgresql.org/docs/9.1/static/sql-truncate.html

Làm việc với bảng được tham chiếu từ bảng khác:

Khi bạn có cơ sở dữ liệu có nhiều hơn một bảng, các bảng có thể có mối quan hệ. Ví dụ, có ba bảng:

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

Và một số dữ liệu đã chuẩn bị cho các bảng này:

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

Đơn đặt hàng trong bảng tham chiếu đến khách hàng trong bảng và thẻ trung thành trong bảng tham chiếu đến khách hàng trong bảng. Khi bạn cố gắng TRUNCATE / DELETE khỏi bảng được tham chiếu bởi / s bảng khác (/ s bảng khác có ràng buộc khóa ngoại đối với bảng được đặt tên), bạn sẽ gặp lỗi. Để xóa nội dung khỏi cả ba bảng, bạn phải đặt tên cho tất cả các bảng này (thứ tự không quan trọng)

TRUNCATE customers, loyalty_cards, orders;

hoặc chỉ bảng được tham chiếu bằng từ khóa CASCADE (bạn có thể đặt tên cho nhiều bảng hơn chỉ một bảng)

TRUNCATE customers CASCADE;

Điều tương tự cũng áp dụng cho pgAdmin. Nhấp chuột phải vào bảng khách hàng và chọn Cắt bỏ Cascaded.


TRUNCATElà một phần của ANSI SQL và được hỗ trợ trong tất cả các DBMS. Tôi đã theo liên kết và tài liệu không đề cập gì đến tiện ích mở rộng. Có lẽ liên kết không chính xác hoặc lỗi thời?
Manngo

Hừm, thú vị. Vẫn có thể tìm thấy văn bản được trích dẫn ở đây: postgresql.org/docs/9.0/static/sql-delete.html nhưng bạn nói đúng - nó không có trong tài liệu cho 9.1.
vitfo

34

Đối với các bảng nhỏDELETE thường nhanh hơn và cần khóa ít tích cực hơn (đối với tải nặng đồng thời):

DELETE FROM tbl;

Không có WHEREđiều kiện.

Đối với các bảng vừa hoặc lớn hơn , hãy chọn TRUNCATE tbl, như @Greg đã đăng.


5
"Nhỏ", "trung bình" và "lớn hơn" (theo ước tính của bạn) là gì?
Jackson

3
@Jackson: Thật khó để xác định chính xác vì nó phụ thuộc vào quá nhiều biến. Bạn có thể chạy một số thử nghiệm để tìm ra điểm hấp dẫn trên hệ thống của mình.
Erwin Brandstetter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.