PostgreSQL: 일련 번호 대 ID
테이블에 정수 자동 번호 지정 기본 키를 지정하려면 다음을 사용합니다.
하지만 나는 테이블을 주목했습니다.information_schema.columns
다수의identity_
필드, 지정자를 사용하여 열을 만들 수 있습니다...
뭐가 달라요?그들이 다른 Postgre와 함께 소개되었습니까?SQL 버전?어느 쪽이 다른 쪽보다 선호됩니까?
serial
는 오랫동안 Postgres의 일부였던 자동 생성 고유 값의 "오래된" 구현입니다.그러나 이는 SQL 표준의 일부가 아닙니다.
SQL 표준을 보다 잘 준수하기 위해 Postgres 10은 다음과 같은 구문을 도입했습니다.generated as identity
.
기본 구현은 여전히 시퀀스를 기반으로 하며, 정의는 이제 SQL 표준을 준수합니다.이 새로운 구문에서 허용하는 한 가지 방법은 실수로 값을 재정의하는 것을 방지하는 것입니다.
다음 표를 고려합니다.
create table t1 (id serial primary key);
create table t2 (id integer primary key generated always as identity);
이제 실행할 때:
insert into t1 (id) values (1);
기본 시퀀스와 테이블의 값이 더 이상 동기화되지 않습니다.다른 프로그램을 실행하는 경우
insert into t1 default_values;
시퀀스가 처음 삽입할 때까지 진행되지 않았으므로 오류가 발생합니다. 이제 값을 삽입하려고 합니다.1
다시.
하지만 두 번째 테이블에서는,
insert into t2 (id) values (1);
결과:
ERROR: cannot insert into column "id" Detail: Column "id" is an identity column defined as GENERATED ALWAYS.
따라서 실수로 시퀀스 사용을 "잊어버릴" 수 없습니다.당신은 여전히 이것을 강요할 수 있습니다, 사용합니다.override system value
옵션:
insert into t2 (id) overriding system value values (1);
여전히 테이블의 값과 동기화되지 않은 시퀀스가 남아 있습니다. 하지만 적어도 이를 알게 되었습니다.
identity
또한 열에는 삽입을 허용하기 위해 역할에 부여해야 하는 부여를 최소화하는 또 다른 이점이 있습니다.
테이블을 사용하는 동안serial
열에는 테이블에 대한 INSERT 권한과 기본 시퀀스에 대한 USAGE 권한이 필요합니다. 이것은 다음을 사용하는 테이블에는 필요하지 않습니다.identity
열INSERT 권한만 부여하면 됩니다.
언급URL : https://stackoverflow.com/questions/55300370/postgresql-serial-vs-identity
'source' 카테고리의 다른 글
각도 2를 사용한 HTML5 이벤트 처리(포커스 및 포커스 아웃) (0) | 2023.05.26 |
---|---|
업데이트 패키지.json 버전 자동으로 (0) | 2023.05.21 |
mongodb는 왜 안돼요? (0) | 2023.05.21 |
Azure 웹 사이트에서 오류 세부 정보를 가져오는 방법 (0) | 2023.05.21 |
여러 개의 예외가 있는 단일 시도 블록 (0) | 2023.05.21 |