Identity Columns

Identity Columns

기본 키로 쓸 값을 데이터베이스가 자동으로 만들어주면 편할 때가 있어요. identity column은 바로 그런 특별한 열이에요. 숨겨진 시퀀스(implicit sequence)로부터 값이 자동 생성되는 열로, 키 값을 만드는 데 쓸 수 있어요. 예전엔 SERIAL이 이 역할을 했지만, 이제는 표준에 가까운 identity column을 권장해요.

출처: 공식문서

identity column 만들기

identity column을 만들려면 CREATE TABLE 안에서 GENERATED ... AS IDENTITY 절을 사용해요:

CREATE TABLE people (
    id bigint GENERATED ALWAYS AS IDENTITY,
    ...,
);

또는 이렇게도 쓸 수 있어요:

CREATE TABLE people (
    id bigint GENERATED BY DEFAULT AS IDENTITY,
    ...,
);

두 방식의 차이는 아래에서 자세히 설명할게요. 문법 세부 사항은 CREATE TABLE 참고 문서를 보세요.

동작 방식

identity column이 있는 테이블에 INSERT를 실행할 때 그 열에 값을 명시적으로 지정하지 않으면, 내부 시퀀스가 만든 값이 삽입돼요. 정의에서 "추가로 적절한 열이 있다"고 가정하고 이런 명령을 실행하면:

INSERT INTO people (name, address) VALUES ('A', 'foo');
INSERT INTO people (name, address) VALUES ('B', 'bar');

id 열에 1부터 시작하는 값이 만들어져서 결과적으로 이런 테이블 데이터가 돼요:

 id | name | address
----+------+---------
  1 | A    | foo
  2 | B    | bar

값 자리에 DEFAULT 키워드를 쓰면 시퀀스가 만든 값을 명시적으로 요청할 수도 있어요:

INSERT INTO people (id, name, address) VALUES (DEFAULT, 'C', 'baz');

마찬가지로 DEFAULT 키워드는 UPDATE 명령에서도 쓸 수 있어요. 그래서 여러 면에서 identity column은 기본값이 있는 열처럼 동작한다고 볼 수 있어요.

ALWAYS vs BY DEFAULT

열 정의의 ALWAYSBY DEFAULT 절은 INSERTUPDATE 명령에서 사용자가 명시적으로 지정한 값을 어떻게 처리할지 결정해요. INSERT에서 ALWAYS를 선택하면, 사용자 지정 값은 INSERT 문이 OVERRIDING SYSTEM VALUE를 지정한 경우에만 받아들여져요. BY DEFAULT를 선택하면 사용자 지정 값이 우선하죠.

정리하면, BY DEFAULT는 기본값을 명시적 값으로 덮어쓸 수 있는 "기본값"에 더 가까운 동작이고, ALWAYS는 실수로 명시적 값을 넣는 것을 더 잘 막아주는 보호 장치예요.

시퀀스 속성과 자료형

identity column의 데이터 타입은 시퀀스가 지원하는 데이터 타입 중 하나여야 해요. (자세한 내용은 CREATE SEQUENCE 참고.) 연관된 시퀀스의 속성은 identity column을 만들 때 지정할 수도 있고(CREATE TABLE 참고), 나중에 ALTER TABLE로 바꿀 수도 있어요.

NOT NULL과 유일성

identity column은 자동으로 NOT NULL로 표시돼요. 하지만 유일성은 보장하지 않는다는 점을 꼭 알아두세요. 시퀀스는 보통 유일한 값을 돌려주지만, 시퀀스가 리셋되거나 앞서 본 것처럼 값이 수동으로 삽입될 수 있기 때문이에요. 유일성을 강제하려면 PRIMARY KEYUNIQUE 제약 조건을 별도로 사용해야 해요.

상속과 파티셔닝에서의 동작

테이블 상속 계층에서 identity column과 그 속성은 자식 테이블에서 부모 테이블과 독립적이에요. 자식 테이블은 부모로부터 identity column이나 그 속성을 자동으로 상속받지 않아요. INSERTUPDATE 중에는, 문이 지정한 테이블에서 해당 열이 identity column이라면 그 열이 identity column으로 취급되고 해당 identity 속성이 적용돼요.

한편 파티션은 파티션 테이블(partitioned table)로부터 identity column을 상속받아요. 파티션은 자기만의 identity column을 가질 수 없고, 특정 identity column의 속성은 파티션 계층 전체에서 일관되게 유지돼요.

더 알아보기 (Learn more)