postgres làm thế nào để thả tất cả các bảng trong một lược đồ thông qua lệnh


10

Tôi sử dụng postgresql và tôi cần bỏ tất cả các bảng có trong lược đồ. Làm thế nào tôi có thể xóa từ dấu nhắc lệnh.

Câu trả lời:


17

Bạn muốn sử dụng CASCADEtùy chọn của DROP SCHEMA. Từ tài liệu :

CASCADE - Tự động thả các đối tượng (bảng, hàm, v.v.) có trong lược đồ và lần lượt tất cả các đối tượng phụ thuộc vào các đối tượng đó

HÃY CẨN THẬN - nhấn mạnh trên tôi.

Rõ ràng bạn sẽ cần tạo lại lược đồ sau đó.

Để chỉ thả tất cả các bảng trong lược đồ hiện tại, bạn có thể sử dụng tập lệnh này:

DO $$ DECLARE
    tabname RECORD;
BEGIN
    FOR tabname IN (SELECT tablename 
                    FROM pg_tables 
                    WHERE schemaname = current_schema()) 
LOOP
    EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(tabname.tablename) || ' CASCADE';
END LOOP;
END $$;

Thay đổi WHERE schemaname = current_schema()nếu bạn muốn thả tất cả các bảng trong một lược đồ khác.


khi tôi sử dụng DROP SCHema schemaname CASCADE; đang gặp lỗi LRI: lỗi cú pháp tại hoặc gần "DROP" LINE 2: Lược đồ DROP
asalthangam

2
LINE 2? Có gì trên dòng 1?
Philᵀᴹ

thực sự tôi cần bỏ tất cả các bảng và đối tượng phụ thuộc của nó. nhưng không nên xóa thủ tục và tất cả ..
asalthangam

nhưng khi tôi sử dụng lệnh thả lược đồ thì nó cũng xóa lược đồ. trong trường hợp của tôi nên tồn tại lược đồ
asalthangam

@asalthangam câu trả lời được cập nhật
Philᵀᴹ

3
yourdb=# DROP SCHEMA *schema_name* CASCADE;

(hoạt động, vừa được thử nghiệm với Postgresql 9.6.3, có thể không hoạt động với các bản phát hành trước)


1

@Techo Savvy

Bỏ bảng bằng cú pháp postgres:

select '-- drop table ' || tablename || ' cascade;' from pg_tables 
where tablename not like 'pg%' and tablename not like 'sql%';

Sao chép văn bản kết quả vào một tập lệnh sql hoặc thiết bị đầu cuối psql. Lưu ý rằng các lệnh được nhận xét.


Câu hỏi là về việc bỏ các bảng trong một lược đồ cụ thể, tôi nghĩ vậy.
mustaccio

-2

Nếu bạn chỉ muốn một cách thực sự đơn giản để làm điều này .. Đây là một kịch bản tôi đã sử dụng trong quá khứ

select 'drop table '||table_name||' cascade constraints;' from user_tables;

Điều này sẽ in ra một loạt các lệnh thả cho tất cả các bảng trong lược đồ. Spool kết quả của truy vấn này và thực hiện nó.

Tương tự như vậy nếu bạn muốn xóa nhiều hơn các bảng, bạn có thể chỉnh sửa các mục sau cho phù hợp với nhu cầu của mình

select 'drop '||object_type||' '|| object_name || ';' from user_objects where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX')

Nguồn: https://forums.oracle.com/forums/thread.jspa?threadID=614090


3
Câu hỏi là Postgres, không phải Oracle.
Philᵀᴹ
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.