2010-11-17 22 views

Trả lời

91

Sử dụng dấu phẩy danh sách tách:

DROP TABLE foo, bar, baz; 

Nếu bạn thực sự cần một footgun, điều này sẽ làm điều đó là công việc:

CREATE OR REPLACE FUNCTION footgun(IN _schema TEXT, IN _parttionbase TEXT) 
RETURNS void 
LANGUAGE plpgsql 
AS 
$$ 
DECLARE 
    row  record; 
BEGIN 
    FOR row IN 
     SELECT 
      table_schema, 
      table_name 
     FROM 
      information_schema.tables 
     WHERE 
      table_type = 'BASE TABLE' 
     AND 
      table_schema = _schema 
     AND 
      table_name ILIKE (_parttionbase || '%') 
    LOOP 
     EXECUTE 'DROP TABLE ' || quote_ident(row.table_schema) || '.' || quote_ident(row.table_name); 
     RAISE INFO 'Dropped table: %', quote_ident(row.table_schema) || '.' || quote_ident(row.table_name); 
    END LOOP; 
END; 
$$; 

SELECT footgun('public', 'tablename'); 
+3

Cảm ơn bạn đã trả lời! Danh sách được phân cách bằng dấu phẩy rất hữu ích cho việc thả một danh sách nhỏ các bảng. Tuy nhiên, nó không thực tế cho việc giảm 20 bảng cùng một lúc (hoặc nhiều hơn). Tôi sẽ tập trung lại câu hỏi để rõ ràng hơn. –

+1

Xin lỗi, đây là lựa chọn duy nhất bạn có. Bạn có thể xây dựng một chức năng được lưu trữ cho điều này, nhưng có một cơ hội tốt bạn sẽ bắn mình vào chân: thả quá nhiều bảng ... –

+2

Chức năng được thêm vào, vui chơi! Và cẩn thận, điều này có thể phá hủy toàn bộ cơ sở dữ liệu của bạn. –

5

Tôi luôn cảm thấy cách thoải mái hơn việc tạo ra một kịch bản sql Tôi có thể xem xét và kiểm tra trước khi tôi chạy nó hơn là dựa vào việc nhận được plpgsql vừa phải để nó không thổi đi cơ sở dữ liệu của tôi. Một cái gì đó đơn giản trong bash mà chọn tablenames từ danh mục, sau đó tạo ra các báo cáo thả cho tôi. Vì vậy, đối với 8.4.x bạn sẽ nhận được truy vấn cơ bản này:

SELECT 'drop table '||n.nspname ||'.'|| c.relname||';' as "Name" 
FROM pg_catalog.pg_class c 
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
WHERE c.relkind IN ('r','v','S','') 
    AND n.nspname <> 'pg_catalog' 
    AND n.nspname <> 'information_schema' 
    AND n.nspname !~ '^pg_toast' 
AND pg_catalog.pg_table_is_visible(c.oid); 

Bạn có thể thêm mệnh đề where vào. (Nơi c.relname iLike 'Bubba%')

Output trông như thế này:

  Name   
----------------------- 
drop table public.a1; 
drop table public.a2; 

Vì vậy, tiết kiệm mà vào một tập tin sql và chạy nó với psql -f filename.sql

+0

Theo dõi, nếu bạn đặt tất cả các bảng cần xóa vào cùng một lược đồ, bạn có thể thả nó bằng cách xếp chồng: giản đồ thả abc thác; –

+0

Lưu ý rằng truy vấn này cũng sẽ tạo ra lệnh 'drop table' cho bất kỳ Sequences nào mà nó tìm thấy ('relkind =' S''). 'thả bảng' trên một chuỗi sẽ thất bại. Thay vào đó, hãy xóa ''S'' khỏi mệnh đề' relkind IN'. Nếu bạn cần thả chuỗi, hãy tạo một truy vấn tương tự với dữ liệu không đổi 'chọn 'chuỗi thả'', lần này với' c.relkind =' S'' – mrjmh

24

Đây là một câu trả lời khác cho vấn đề này. Nó hoạt động trong ubuntu và có thể một số os khác quá. làm một \dt trong dấu nhắc lệnh postgres (dấu nhắc lệnh đang chạy bên trong genome-terminal trong trường hợp của tôi). Sau đó, bạn sẽ thấy rất nhiều bảng trong thiết bị đầu cuối. Bây giờ hãy sử dụng chức năng ctrl+click-drag của genome-terminal để sao chép tất cả tên của các bảng. enter image description here Mở python, thực hiện xử lý chuỗi (thay thế '' theo '' và sau đó '\ n' theo ',') và bạn nhận danh sách được phân cách bằng dấu phẩy của tất cả các bảng. Bây giờ trong psql shell làm một drop table CTRL+SHIFT+V và bạn đã hoàn tất. Tôi biết nó quá cụ thể mà tôi chỉ muốn chia sẻ. :)

+0

Công trình này tuyệt vời, nó cho phép bạn dễ dàng biết rõ về những gì bạn muốn làm. –

+4

Những gì tôi làm tương tự, tôi viết: 'DROP TABLE whatever_' và sau đó nhấn TAB, sao chép tất cả các bảng vào clipboard, mở tuyệt vời, Tìm/Thay thế và thay thế bằng Regular Expressions,' '\ s +' 'cho' ' , '' và dán trên thiết bị đầu cuối. –

6

Tiết lộ: câu trả lời này dành cho người dùng Linux.

tôi sẽ thêm một số hướng dẫn cụ thể hơn để @prongs gì nói:

  • \dt có thể hỗ trợ các kí hiệu: vì vậy bạn có thể chạy \dt myPrefix* ví dụ, để chỉ chọn các bảng bạn muốn thả;
  • sau CTRL-SHIFT-DRAG để chọn sau đó CTRL-SHIFT-C để sao chép văn bản;
  • trong vim, truy cập INSERT MODE và dán các bảng bằng CTRL-SHIFT-V;
  • nhấn ESC, sau đó chạy :%s/[ ]*\n/, /g để dịch nó sang danh sách được phân tách bằng dấu phẩy, sau đó bạn có thể dán nó (trừ dấu phẩy cuối cùng) trong DROP TABLE % CASCADE.
0

Sử dụng công cụ dòng lệnh Linux, nó có thể được thực hiện theo cách này:

psql -d mydb -P tuples_only=1 -c '\dt' | cut -d '|' -f 2 | paste -sd "," | sed 's/ //g' | xargs -I{} echo psql -d mydb -c "drop table {};" 

LƯU Ý: Các tiếng vang cuối cùng là có bởi vì tôi không thể tìm thấy một cách để đặt dấu ngoặc kép quanh lệnh thả, vì vậy bạn cần phải sao chép và dán đầu ra và tự thêm dấu ngoặc kép.

Nếu bất kỳ ai cũng có thể khắc phục vấn đề nhỏ đó, đó sẽ là nước sốt tuyệt vời.

1

Vì vậy, tôi đã gặp sự cố này ngay hôm nay. Tôi tải db máy chủ của tôi thông qua pgadmin3 và đã làm theo cách đó. Các bảng được sắp xếp theo thứ tự bảng chữ cái để thay đổi và nhấn theo sau là xóa hoạt động tốt.

+0

Bạn có thể làm điều này nhưng bạn phải sử dụng cửa sổ 'Thuộc tính' – Matt

5

Tôi đã sử dụng cái này.

echo "select 'drop table '||tablename||';' from pg_tables where tablename like 'name%'" | \ 
    psql -U postgres -d dbname -t | \ 
    psql -U postgres -d dbname 
Các vấn đề liên quan