Cách bỏ nhiều bảng trong PostgreSQL bằng ký tự đại diện


82

Khi làm việc với các phân vùng, thường có nhu cầu xóa tất cả các phân vùng cùng một lúc.

Tuy nhiên

DROP TABLE tablename*

Không hoạt động. (Ký tự đại diện không được tôn trọng).

Có cách nào thanh lịch (đọc: dễ nhớ) để thả nhiều bảng trong một lệnh bằng ký tự đại diện không?

Câu trả lời:


115

Sử dụng danh sách được phân tách bằng dấu phẩy:

DROP TABLE foo, bar, baz;

Nếu bạn thực sự cần một khẩu súng ngắn, cái này sẽ làm công việc của nó:

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! Một danh sách được phân tách bằng dấu phẩy là rất tốt để loại bỏ một danh sách nhỏ các bảng. Tuy nhiên, việc giảm 20 bàn cùng một lúc (hoặc nhiều hơn) là không thực tế. Tôi sẽ tập trung lại câu hỏi để rõ ràng hơn.
Tom Feiner

2
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 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 trong bàn chân: thả quá nhiều bảng ...
Frank Heikens

4
Chức năng được thêm vào, vui chơi! Và hãy 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.
Frank Heikens,

chỉ thiếu một || ' CASCADE ';và nó là hoàn hảo
MFARID

28

Đây là một câu trả lời khó hiểu khác cho vấn đề này. Nó hoạt động trong ubuntuvà có thể một số hệ điều hành khác nữa. thực hiện một \dtdấu nhắc lệnh trong postgres (dấu nhắc lệnh đang chạy bên trong genome-terminaltrong 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ờ sử dụng ctrl+click-dragchức năng của genome-terminalđể sao chép tên của tất cả các bảng. nhập mô tả hình ảnh ở đâyMở python, thực hiện một số xử lý chuỗi (thay thế '' bằng '' và sau đó '\ n' bằng ',') và bạn nhận được danh sách được phân tá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+Vvà bạn đã hoàn tất. Tôi biết nó quá cụ thể tôi chỉ muốn chia sẻ. :)


Điều này rất hiệu quả, nó cho phép bạn dễ dàng trình bày rõ ràng về những gì bạn muốn làm.
Brad Koch

5
Những gì tôi làm cũng 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 khay nhớ tạm, mở sublime, Tìm / Thay thế và thay thế bằng Biểu thức chính quy, \s+cho ,và dán trên thiết bị đầu cuối.
Alfonso Pérez

yup đây là nó cho 5 đến nhiều bảng. đối với một danh sách dài, hãy chạy truy vấn tên bảng, chuyển từ psql sang trình soạn thảo của bạn bằng cách sử dụng \e, sao chép trong danh sách của bạn và đặt dấu phẩy.
Merlin

Ngoài ra, trong pgadmin3 nếu bạn chọn tên lược đồ, sau đó chuyển đến tab 'Người phụ thuộc', bạn có thể chọn tất cả các bảng (bằng phím shift) và sau đó sao chép tất cả chúng bằng CTRL + C. Sau đó, sử dụng một số trình soạn thảo văn bản để tạo BẢNG DROP [ tên, ..] truy vấn.
Mate Šimović

18

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

Thay thế trong các giá trị thích hợp cho dbnamename%.


12

Tôi luôn cảm thấy thoải mái hơn khi tạo một script sql mà tôi có thể xem lại và kiểm tra trước khi chạy nó hơn là dựa vào việc tải plpgsql vừa phải để nó không làm hỏng cơ sở dữ liệu của tôi. Một cái gì đó đơn giản trong bash chọn tên bảng từ danh mục, sau đó tạo câu lệnh 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. ( where c.relname ilike 'bubba%')

Đầu ra giống như sau:

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

Vì vậy, hãy lưu nó vào tệp .sql và chạy nó với psql -f filename.sql


Tiếp theo, 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ể loại bỏ nó bằng cascade: drop schema abc cascade;
Scott Marlowe

Lưu ý rằng truy vấn này cũng sẽ tạo ra một drop tablelệnh cho bất kỳ Chuỗi nào mà nó tìm thấy ( relkind = 'S'). drop tabletrên một chuỗi sẽ không thành công. Thay vào đó, hãy loại bỏ 'S'khỏi relkind INmệnh đề. Nếu bạn cần loại bỏ các chuỗi, hãy tạo một truy vấn tương tự với dữ liệu không đổi select 'drop sequence', lần này vớic.relkind = 'S'
mrjmh

9

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 cho những gì @prongs đã nói:

  • \dtcó thể hỗ trợ các ký tự đại diện: 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;
  • vào vim, đi đến INSERT MODEvà dán các bảng với 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) vào DROP TABLE % CASCADE.

3

Sử dụng các 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 Ý: Tiếng vọng cuối cùng ở đó vì tôi không thể tìm cách đặt dấu ngoặc kép xung quanh lệnh drop, vì vậy bạn cần sao chép và dán đầu ra và tự thêm dấu ngoặc kép.

Nếu ai đó 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 phải đối mặt với vấn đề này ngày hôm nay. Tôi đã tải db máy chủ của mình 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 nên việc dịch chuyển và nhấp chuột sau đó xóa hoạt động tốt.


Bạn có thể làm điều này nhưng bạn phải sử dụng cửa sổ 'Properties'
Matt
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.