Nhận tất cả các tên phân vùng cho một bảng


12

Tôi muốn liệt kê tất cả các phân vùng được tạo bởi các kích hoạt động trong PostgreSQL 9.1.
Tôi đã có thể tạo ra một số lượng phân vùng bằng cách sử dụng câu trả lời liên quan này của Frank Heikens .

Tôi có một bảng foovới trình kích hoạt chèn tạo foo_1, foo_2v.v. Phân vùng để chèn được chọn dựa trên id khóa chính, phân vùng dựa trên phạm vi.

Có thể hiển thị tất cả các phân vùng hiện tại cho bảng foo?

Câu trả lời:


19

Sử dụng truy vấn đầu tiên từ câu trả lời bạn đã liên kết và thêm một WHEREmệnh đề đơn giản để nhận các phân vùng của một bảng duy nhất:

SELECT
    nmsp_parent.nspname AS parent_schema,
    parent.relname      AS parent,
    nmsp_child.nspname  AS child_schema,
    child.relname       AS child
FROM pg_inherits
    JOIN pg_class parent            ON pg_inherits.inhparent = parent.oid
    JOIN pg_class child             ON pg_inherits.inhrelid   = child.oid
    JOIN pg_namespace nmsp_parent   ON nmsp_parent.oid  = parent.relnamespace
    JOIN pg_namespace nmsp_child    ON nmsp_child.oid   = child.relnamespace
WHERE parent.relname='parent_table_name';

6

Sử dụng loại định danh đối tượng regclass, điều này có thể được đơn giản hóa đáng kể:

Liệt kê tất cả các bảng con của parent_schema.foo:

SELECT i.inhrelid::regclass AS child -- optionally cast to text
FROM   pg_inherits i
WHERE  i.inhparent = 'my_schema.foo'::regclass;

Tên bảng bạn cung cấp cho các regclasstùy chọn có thể tùy chọn đủ điều kiện lược đồ. Nếu không, search_pathquyết định tầm nhìn.

Tương tự, tên bảng được trả về là đủ điều kiện lược đồ và tự động thoát khi cần thiết.
Rất an toàn, nhanh chóng và thuận tiện.

BTW, để hiển thị bảng nguồn trên mỗi hàng cho bất kỳ hàng nào được truy xuất từ ​​bất kỳ bảng nào:

SELECT tableoid::regclass AS source, *
FROM   my_schema.foo
WHERE <some_condition>;
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.