2015-02-03 9 views
6

형식에서 "파생 형식"을 만들 수 있습니까? Java에서 extends처럼.PostgreSQL의 파생 형식

create type mytype as (
    f1 int, 
    --many other fields... 
    fn varchar(10) 
); 

create type mytype_extended as (
    f1 int, 
    --many other fields... 
    fn varchar(10), 

    fx int --one field more 
); 

당신이 중복이라고 볼 수

는 예를 들어 나는이 유형이 필요합니다. 앞으로 mytype을 변경하면 mytype_extended도 변경해야합니다.

create type mytype as (
    f1 int, 
    --many other fields... 
    fn varchar(10) 
); 

create type mytype_extended as (
    mt mytype, 

    fx int --one field more 
); 

하지만 대신 f1, f2... fn, fx 단지 2 필드 mt (복합 형, 나는 생각한다) 및 fx을 가지고 mytype_extended 리드 :

나는이 시도.

이 방법이 있습니까?

답변

5

이 직접 입력 상속 없지만, 당신은 몇 가지 옵션이 있습니다 : 당신은 상속 유형을 만들 수있는 테이블을 상속 만들 수 있습니다

1. Table inheritance

(PostgreSQL을 항상 모든 테이블에 대한 복합 형식을 만들 것이다,) 같은 이름을 가진 :

create table supertable (
    foo int, 
    bar text 
); 

create table subtable (
    baz int 
) inherits (supertable); 

2. Construct views using each other

때문에 뷰 (,373을과 (현실에서) 테이블입니다3210)는, 종류가 너무 그들 각각에 대해 생성됩니다 : 이것은

create view superview 
    as select null::int foo, 
      null::text bar; 

create view subview 
    as select superview.*, 
      null::int baz 
    from superview; 

3. Type composition

당신은 시도했다.

create type supertype as (
    foo int, 
    bar text 
); 

create type subtype as (
    super supertype, 
    baz int 
); 

-- resolve composition manually 
select get_foo(v),  -- this will call get_foo(subtype) 
     get_foo((v).super) -- this will call get_foo(supertype) 
from (values (((1, '2'), 3)::subtype)) v(v); 

한 트루 타입 상속 : 당신은 일반적으로이 하나 더 제어 할 수 있습니다?

SQL :

PostgreSQL's documentation explicitly says는 해당 테이블 상속은 표준의 유형 상속되지 않습니다 1999 년 이후 여기에 설명 된 기능이 많은면에서 다른 유형의 상속 기능을 정의합니다.

-- if there is a get_foo(supertable) function, 
-- but there is no get_foo(subtable) function: 

select get_foo((1, '2')::supertable); -- will call get_foo(supertable) 
select get_foo((1, '2', 3)::subtable); -- will also call get_foo(supertable) 

SQLFiddle

: 그럼에도 불구하고

는 테이블의 자동 생성 유형은 정말 (슈퍼 유형을 사용할 수있는 위치가, 사용할 수있는) 사실 상속 유형처럼 작동 상속

2

테이블에 암시 적으로 유형이 정의되어 있으므로 테이블 상속을 사용할 수 있습니다. CREATE TABLE에서 인용

CREATE TABLE은 자동 테이블의 하나의 행에 대응하는 복합 형 나타내는 데이터 유형을 생성한다. 따라서 테이블은 동일한 스키마에있는 기존 데이터 형식과 동일한 이름을 가질 수 없습니다. 테이블

귀하의 예 :

create table mytype (
    f1 int, 
    --many other fields... 
    fn varchar(10) 
); 

create table mytype_extended(
    fx int 
) inherits (mytype); 

psql의와 테이블 설명 :

 
# \d mytype_extended 

     Table "public.mytype_extended" 
Column |   Type   | Modifiers 
--------+-----------------------+----------- 
f1  | integer    | 
fn  | character varying(10) | 
fx  | integer    | 
Inherits: mytype 
이제

의 기본 테이블에 열을 추가하고 상속 표를 얻을 수 있는지 확인하자를 너무 :

alter table mytype add other_column int; 
 
# \d mytype_extended 
      Table "public.mytype_extended" 
    Column |   Type   | Modifiers 
--------------+-----------------------+----------- 
f1   | integer    | 
fn   | character varying(10) | 
fx   | integer    | 
other_column | integer    | 
Inherits: mytype 
PostgreSQL의에서 5,