PostgreSQL 세 가지 자체 증가 열 sequence,serial,idenity 의 용법 차이
7413 단어 PostgreSQLsequenceserialidentity
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;
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redmine 데이터베이스를 MySQL에서 PostgreSQL로 마이그레이션 (보충)Redmine 의 Database 를 MySQL 로 운용하고 있었습니다만, MySQL 5.6 이상이나 MariaDB 에는 , , 이러한 티켓이 수년 동안 방치된 상황을 감안하여, PostgreSQL로 마이그레이션하기...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.