table inheritance(상속)

POSTGRESQL 2014. 10. 28. 10:40
postgreSQL은 테이블 생성시에 하나이상의 다른 테이블로부터의 상속기능을 제공합니다.
상속받은 테이블을 자식테이블, 상속대상 테이블을 부모테이블로 할때 자식테이블을 create table 시 INHERITS 옵션을 이용하여 부모테이블의 컬럼, check / not-null 제약조건을 상속받습니다.
아래는 자식테이블 생성 및 조회에 대한 예제입니다.

1. 부모테이블을 생성합니다.
postgres=# CREATE TABLE cities (
postgres(#     name            text,
postgres(#     population      float,
postgres(#     altitude        int     -- in feet
postgres(# );
CREATE TABLE
postgres=# \d+ cities
                       Table "public.cities"
   Column   |       Type       | Modifiers | Storage  | Description 
------------+------------------+-----------+----------+-------------
 name       | text             |           | extended | 
 population | double precision |           | plain    | 
 altitude   | integer          |           | plain    | 
Has OIDs: no


2. cities 테이블을 상속받는 자식테이블 capitals을 IHERIT 구문을 이용하여 생성합니다.
postgres=# CREATE TABLE capitals (
postgres(#     state           char(2)
postgres(# ) INHERITS (cities);
CREATE TABLE
postgres=# \d+ capitals;
                      Table "public.capitals"
   Column   |       Type       | Modifiers | Storage  | Description 
------------+------------------+-----------+----------+-------------
 name       | text             |           | extended | 
 population | double precision |           | plain    | 
 altitude   | integer          |           | plain    | 
 state      | character(2)     |           | extended | 
Inherits: cities
Has OIDs: no


3. 부모테이블에 대한 조회/수정/삭제 SQL은 자식테이블을 포함하여 조회/수정/삭제되며, only 옵션을 이용하여 하나의 테이블을 지정할 수 있습니다.
postgres=# insert into cities values('kms',10.23,1000);
INSERT 0 1
postgres=# insert into capitals values('kms',10.23,1000,'01');
INSERT 0 1
postgres=# select * from cities;
 name | population | altitude 
------+------------+----------
 kms  |      10.23 |     1000
 kms  |      10.23 |     1000
(2 rows)
                           ^
postgres=# select * from only cities;
 name | population | altitude 
------+------------+----------
 kms  |      10.23 |     1000
(1 row)


4. 상속받은 테이블을 부모테이블로 하는 또다른 자식테이블을 생성하면, 최상위 부모테이블에 대한 조회/수정/삭제질의는 전계층의 테이블을 포함합니다.
postgres=# create table streets(col1 char(1)) inherits(capitals);
insert into streets values ('kms',20.24,2100,02,'1');
INSERT 0 1

postgres=# select * from only cities;
 name | population | altitude 
------+------------+----------
 kms  |      10.23 |     1000
(1 row)

postgres=# select * from only capitals;
 name | population | altitude | state 
------+------------+----------+-------
 kms  |      10.23 |     1000 | 01
(1 row)

postgres=# select * from streets;
 name | population | altitude | state | col1 
------+------------+----------+-------+------
 kms  |      20.24 |     2100 | 2     | 1
(1 row)

postgres=# select * from cities;
 name | population | altitude 
------+------------+----------
 kms  |      10.23 |     1000
 kms  |      10.23 |     1000
 kms  |      20.24 |     2100
(3 rows)


※ 가독성을 높히기 위해 부모테이블을 대상으로 하는 쿼리를 작성할 때 테이블 후미에 *를 붙여 상속테이블이 포함될 것임을 표시하는 것을 권장합니다.
예시) select * from cities*;