2010-08-19 75 views
5

Có thể xóa tất cả các hàng khỏi tất cả các bảng bằng một lệnh duy nhất trong postgres (mà không phá hủy cơ sở dữ liệu), hoặc để xóa một lần xóa trong postgres?Postgres: xóa tất cả các bảng hoặc xếp hàng xóa?

Nếu không, thì làm cách nào tôi có thể đặt lại cơ sở dữ liệu thử nghiệm của mình?

Trả lời

7

là nó có thể hoặc là để xóa tất cả các hàng từ tất cả các bảng với một lệnh duy nhất trong postgres

Bạn nói đúng, câu trả lời là KHÔNG

Bạn có thể định nghĩa tầng phím nước ngoài sẽ xóa tất cả các hàng tham chiếu nếu "cha mẹ" bị xóa. Nhưng đó là một thuộc tính của khóa ngoại, không có gì bạn có thể chỉ định với câu lệnh DELETE

nếu không - wow.

Điều đó nghĩa là gì?

Suy nghĩ thứ hai: bạn đang cố gắng đạt được điều gì?

Tôi có nghi ngờ rằng bạn đang cố gắng "đặt lại", ví dụ: một cơ sở dữ liệu thử nghiệm. Trong trường hợp đó, cách tiếp cận PostgreSQL sẽ là:

  • Tạo một cơ sở dữ liệu có chứa tất cả mọi thứ (bảng biểu, quan điểm, chỉ số vv), bạn cần trong một cơ sở dữ liệu mới (gọi nó là ví dụ my_template)
  • Để thiết lập lại Test- hiện tại của bạn DB, hãy thực hiện DROP DATABASE testdb và sau đó tạo lại cơ sở dữ liệu thử nghiệm bằng cách sử dụng CREATE DATABASE testdb TEMPLATE my_template

Testdb mới tạo sẽ có tất cả các bảng được định nghĩa trong my_template. Đó có thể là số nhiều hơn nhanh hơn xóa tất cả các hàng.

+1

Bạn nói đúng, đó chính xác là những gì tôi đang cố gắng làm và tôi cảm thấy thất vọng khi các bưu cục không có cách đơn giản để xóa dữ liệu nhanh chóng. Tôi sẽ tạo một mẫu - cảm ơn sự giúp đỡ. – AP257

+0

Như bạn có vẻ mong đợi một loại "DELETE tất cả mọi thứ TỪ" loại tuyên bố tôi tự hỏi tại sao? Không có cơ sở dữ liệu mà tôi biết hỗ trợ này. –

+0

Vâng, điều tôi thực sự thích là DELETE CASCADE. Trong trường hợp không có, DELETE tất cả mọi thứ TỪ sẽ là một thay thế chấp nhận được. Nhưng không có một chút đau đớn! – AP257

5

Bạn có thể viết thủ tục được lưu trữ để chọn tất cả các bảng trong tất cả các lược đồ và sau đó thực hiện DELETE CASCADE hoặc TRUNCATE trên các bảng này. Nó chỉ là một vài dòng pl/pgsql-code, không phải là một vấn đề lớn.

Chỉnh sửa: Thao tác này sẽ thực hiện thủ thuật nhưng hãy cẩn thận! :

CREATE OR REPLACE FUNCTION truncate_all() RETURNS void LANGUAGE plpgsql AS 
$$ 
DECLARE 
    row record; 
    query text; 
BEGIN 
    query := 'SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema NOT IN(''pg_catalog'', ''information_schema'') AND table_type = ''BASE TABLE'''; 

    FOR row IN EXECUTE query LOOP 
     EXECUTE 'TRUNCATE ' || quote_ident(row.table_schema) || '.' || quote_ident(row.table_name) || ' CASCADE;'; 
    END LOOP; 

    RETURN; 
END; 
$$; 

-- execute: 
SELECT truncate_all(); 
+3

+1: [TRUNCATE] (http://www.postgresql.org/docs/8.1/interactive/sql-truncate.html) sẽ là lựa chọn của tôi - không phải là người hâm mộ của 'DELETE CASCADE', quá dễ dàng để bắt kịp chất béo fingering ... –

+0

Giải pháp sẽ chỉ hoạt động nếu cơ sở dữ liệu không có khóa ngoại được xác định mà sẽ chỉ đúng cho cơ sở dữ liệu rất đơn giản. Nhưng chức năng này có thể được tăng cường để đầu tiên thả tất cả các ràng buộc hiện có, và sau đó cắt bớt tất cả các bảng. –

+0

Không, không phải đâu, đó là nơi CASCADE đến. Chỉ cần kiểm tra nó và bạn sẽ thấy. http://www.postgresql.org/docs/current/static/sql-truncate.html –

Các vấn đề liên quan