2011-10-07 37 views
9

Trong PostgreSQL cho các bảngKiểm tra xem bảng kế thừa từ bảng khác trong PostgreSQL

CREATE TABLE cities (
    name   text, 
    population  float, 
    altitude  int  -- in feet 
); 

CREATE TABLE cities_capitals (
    state   char(2) 
) INHERITS (cities); 

Làm thế nào tôi có thể lập trình kiểm tra dù một trong những bảng thừa hưởng từ một bảng hay không? (Hãy suy nghĩ information_schema, pg_catalog, ...)

Nên là true cho thành phố_capitals và false cho các thành phố.

Trả lời

10

Có bảng danh mục cho rằng: pg_inherits.

Danh mục pg_inherits ghi lại thông tin về bảng thừa kế cấu trúc phân cấp. Có một mục nhập cho mỗi bảng con trực tiếp trong cơ sở dữ liệu . (Kế thừa gián tiếp có thể được xác định bằng chuỗi sau các mục.)

Dưới đây là một truy vấn phù hợp với câu hỏi của bạn:

SELECT EXISTS (
    SELECT 1 
    FROM pg_catalog.pg_inherits 
    WHERE inhrelid = 'public.cities_capitals'::regclass 
    ); 

TRUE nếu bảng cities_capitals kế thừa từ một nơi nào, nếu không FALSE.
Loại lược đồ đủ điều kiện để chắc chắn.

+0

Tôi nên liên hệ như thế nào với người không có tên bảng trong lược đồ? –

+0

@AxelFontaine: Tôi đã thêm vào câu trả lời của mình. Nó thực sự khá đơn giản - một khi bạn biết điều đó. ;) –

3

Câu lệnh sau sẽ truy xuất các bảng mà cities kế thừa từ đó. Nếu bảng không kế thừa từ bảng khác, kết quả sẽ là rỗng:

select bt.relname as table_name, bns.nspname as table_schema 
from pg_class ct 
    join pg_namespace cns on ct.relnamespace = cns.oid and cns.nspname = 'public' 
    join pg_inherits i on i.inhrelid = ct.oid and ct.relname = 'cities ' 
    join pg_class bt on i.inhparent = bt.oid 
    join pg_namespace bns on bt.relnamespace = bns.oid 
0

Từ AutoDoc PostgreSQL tôi thấy SQL này:

SELECT parnsp.nspname AS par_schemaname 
    , parcla.relname AS par_tablename 
    , chlnsp.nspname AS chl_schemaname 
    , chlcla.relname AS chl_tablename 
FROM pg_catalog.pg_inherits 
JOIN pg_catalog.pg_class AS chlcla ON (chlcla.oid = inhrelid) 
JOIN pg_catalog.pg_namespace AS chlnsp ON (chlnsp.oid = chlcla.relnamespace) 
JOIN pg_catalog.pg_class AS parcla ON (parcla.oid = inhparent) 
JOIN pg_catalog.pg_namespace AS parnsp ON (parnsp.oid = parcla.relnamespace) 

Đây là hữu ích khi bạn có thể kiểm tra theo cả hai hướng với một truy vấn.

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