PostgreSQL 세 가지 자체 증가 열 sequence,serial,idenity 의 용법 차이

이 세 대상 은 모두 자 증 을 실현 할 수 있다.여기 서 다음 과 같은 몇 가지 차원 에서 이 몇 개의 대상 이 어떤 차이 가 있 는 지 살 펴 보 자.그 중에서 기능 성 을 보면 대부분 특성 이 일치 하거나 유사 하 다.

1.sequence 는 모든 데이터 베이스 에서 의 성질 이 똑 같 습 니 다.구체 적 인 필드 와 강 한 연결 이 아니 라 여러 개의 대상 간 공 유 를 지원 하 는 것 이 특징 입 니 다.
sequence 가 필드 값 을 늘 릴 때 표 에 대한 기록 은 sequence(GRANT USAGE ON SEQUENCE testold_id_seq;)
sequence 형식의 필드 시트,CREATE TABLE new 사용 중table LIKE old_table 일 때 새 표 의 자체 증가 필드 는 원본 표 의 sequence 를 가리 키 는 데 오래 걸 립 니 다.
결론:
자체 증가 필드 에 대해 특별한 수요 가 없 는 상황 에서 sequence 는'자체 증가 열'로 가장 좋 은 선택 이 아 닙 니 다.
2.idenity 본질은 표준 sql 의 문법 을 호 환 하기 위해 새로 추 가 된 것 으로 일부 serial 의 결함 을 복원 했다.예 를 들 어 alter table 방식 으로 serial 필드 를 추가 하거나 삭제 할 수 없다.
2.1 idenity 는 generated by default as idenity 로 정의 되 고 명시 적 삽입 도 허용 합 니 다.
2.2 idenity 는 always as idenity 로 정의 되 고 overriding system value 도 명시 적 으로 삽입 하지 않 을 수 있 습 니 다.
결론:
idenity 는 serial 의'증강 판'으로'자체 증가 열'로 사용 하기에 더욱 적합 하 다.
3.sequence,serial,idenity 의 공 통 된 단점 은 명시 적 삽입 후 부가 가치 가 표 의 최대 Id 로 업데이트 되 지 못 한 다 는 점 이다.이 점 을 재 명시 적 으로 삽입 한 상황 에서 잠재 적 인 증가 필드 Id 충돌 이다.
결론:
추가 열 이 명시 적 으로 삽 입 된 후에 표 의 최대 Id 로 수 동 으로 초기 화 해 야 합 니 다.
4.증가 필드 의 update 는 자세히 보지 않 았 습 니 다.상대 적 으로 증가 열 의 명시 적 삽입 은 일반적인 작업 입 니 다.증가 열 에 대한 update 작업 은 머리 에 문제 가 없 으 면 보통 이렇게 하지 않 습 니 다.
원시 원 고 는 정리 하기 가 귀 찮 고 원리 적 인 것 은 언급 하지 않 으 니 한번 해 보면 알 수 있다.

---------------------------------------------------------sequence-------------------------------------------------------------
create sequence myschema.seq_1 INCREMENT BY 1 MINVALUE 1 START WITH 1;
create table myschema.test_seq
(
 id int not null default nextval('myschema.seq_1') primary key,
 name varchar(10)
);
    
insert into myschema.test_seq (name) values ('aaa');
insert into myschema.test_seq (name) values ('bbb');
insert into myschema.test_seq (name) values ('ccc');
select * from myschema.test_seq;
    
insert into myschema.test_seq (id,name) values (5,'ddd');
select * from test_seq;
      
--      
insert into myschema.test_seq (name) values ('eee');
--    ,    ,          ,              
insert into myschema.test_seq (name) values ('fff');
--        
select setval('myschema.seq_1',(select max(id) from myschema.test_seq)::BIGINT);
--     ,        
begin;
insert into myschema.test_seq (name) values ('ggg');
rollback;
-- truncate    ,      
truncate table myschema.test_seq;
--    
ALTER SEQUENCE myschema.seq_1 RESTART WITH 1;
---------------------------------------------------------serial-------------------------------------------------------------
create table myschema.test_serial
(
 id serial primary key,
 name varchar(100)
)
select * from test_serial;
insert into myschema.test_serial(name) values ('aaa');
insert into myschema.test_serial(name) values ('bbb');
insert into myschema.test_serial(name) values ('ccc');
select * from myschema.test_serial;
--    ,    
insert into myschema.test_serial(id,name) values (5,'ccc');
--      ,      ,        ,serial          Id   ,serial               
insert into myschema.test_serial(name) values ('xxx');
insert into myschema.test_serial(name) values ('yyy');
select * from myschema.test_serial;
--truncate table  serial    
truncate table myschema.test_serial;
insert into myschema.test_serial(name) values ('aaa');
insert into myschema.test_serial(name) values ('bbb');
insert into myschema.test_serial(name) values ('ccc');
select * from myschema.test_serial;
--             ,  :  
begin;
insert into myschema.test_serial(name) values ('yyy');
rollback;
--  serial,         Id             Id,       
SELECT SETVAL((SELECT pg_get_serial_sequence('myschema.test_serial', 'id')), 1, false);
---------------------------------------------------------identity-------------------------------------------------------------
drop table myschema.test_identiy_1 
create table myschema.test_identiy_1 
(
 id int generated always as identity (cache 100 START WITH 1 INCREMENT BY 1) primary key , 
 name varchar(100)
);
create table myschema.test_identiy_2
(
 id int generated by default as identity (cache 100 START WITH 1 INCREMENT BY 1) primary key , 
 name varchar(100)
);
insert into myschema.test_identiy_1(name) values ('aaa');
insert into myschema.test_identiy_1(name) values ('bbb');
insert into myschema.test_identiy_1(name) values ('ccc');
insert into myschema.test_identiy_2(name) values ('aaa');
insert into myschema.test_identiy_2(name) values ('bbb');
insert into myschema.test_identiy_2(name) values ('ccc');
select * from myschema.test_identiy_1;
--     ,     generated always as identity        ,    overriding system value   
--     overriding system value,  
insert into myschema.test_identiy_1(id,name) values (5,'ccc');
insert into myschema.test_identiy_1(id,name)overriding system value values (5,'ccc');
select * from myschema.test_identiy_2;
--     ,     generated by default as identity       ,
insert into myschema.test_identiy_2(id,name) values (5,'ccc');
--     ,      ,        ,identity                 
insert into myschema.test_identiy_2(name) values ('xxx');
insert into myschema.test_identiy_2(name) values ('yyy');
select * from myschema.test_identiy_2;
   identity   ,    always as identity,  overriding system value       
   generated by default as identity       
     ,         ,        overriding system value
--truncate     ,       
truncate table myschema.test_identiy_1;
select * from myschema.test_identiy_1;
begin;
insert into myschema.test_identiy_1(name) values ('xxx');
rollback;
--truncate  RESTART IDENTITY ,      
TRUNCATE table myschema.test_identiy_1 RESTART IDENTITY;
select * from myschema.test_identiy_1
--identity           
ALTER TABLE myschema.test_identiy_1 ALTER COLUMN id RESTART WITH 100;
실제 idenity 자체 성장 열의 현재 시작 값 변경(기 존 최대 값+1):

보충:PostgreSQL 의 서로 다른 표 는 서로 다른 자체 증가 서열 을 사용 합 니 다.
hibenate 프로필 에는 다음 과 같 을 것 입 니 다:

<id name="id">
  <generator class="sequence">
  <param name="sequence">adminuser</param>
  </generator>
 </id>
xdoclet 을 사용 할 때 클래스 의 설정 은 다음 과 같 아야 합 니 다:

/**
 * @hibernate.id generator-class="sequence"
 * @hibernate.generator-param name="sequence" value="adminuser"
 */
 
 private int id;
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기