검색결과 리스트
글
table inheritance(상속)
POSTGRESQL
2014. 10. 28. 10:40
postgreSQL은 테이블 생성시에 하나이상의 다른 테이블로부터의 상속기능을 제공합니다.
상속받은 테이블을 자식테이블, 상속대상 테이블을 부모테이블로 할때 자식테이블을 create table 시 INHERITS 옵션을 이용하여 부모테이블의 컬럼, check / not-null 제약조건을 상속받습니다.
아래는 자식테이블 생성 및 조회에 대한 예제입니다.
1. 부모테이블을 생성합니다.
2. cities 테이블을 상속받는 자식테이블 capitals을 IHERIT 구문을 이용하여 생성합니다.
3. 부모테이블에 대한 조회/수정/삭제 SQL은 자식테이블을 포함하여 조회/수정/삭제되며, only 옵션을 이용하여 하나의 테이블을 지정할 수 있습니다.
4. 상속받은 테이블을 부모테이블로 하는 또다른 자식테이블을 생성하면, 최상위 부모테이블에 대한 조회/수정/삭제질의는 전계층의 테이블을 포함합니다.
※ 가독성을 높히기 위해 부모테이블을 대상으로 하는 쿼리를 작성할 때 테이블 후미에 *를 붙여 상속테이블이 포함될 것임을 표시하는 것을 권장합니다.
예시) select * from cities*;
상속받은 테이블을 자식테이블, 상속대상 테이블을 부모테이블로 할때 자식테이블을 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*;
'POSTGRESQL' 카테고리의 다른 글
| md5를 이용한 password hash value 구하기 (0) | 2014.11.26 |
|---|---|
| [9.4 beta]ALTER SYSTEM 구문을 이용한 파라메터 변경 (0) | 2014.10.29 |
| max_connections 와 커널파라메터 (0) | 2014.10.27 |
| postgresql DBLINK 예제 (0) | 2014.10.27 |
| gdb로 postgresql backend process 디버깅하기 (0) | 2014.10.26 |