source

PostgreSQL: 일련 번호 대 ID

manycodes 2023. 5. 21. 11:41
반응형

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 권한이 필요합니다. 이것은 다음을 사용하는 테이블에는 필요하지 않습니다.identityINSERT 권한만 부여하면 됩니다.


직렬 대신 새 ID 구문을 사용하는 것이 좋습니다.

언급URL : https://stackoverflow.com/questions/55300370/postgresql-serial-vs-identity

반응형