PostgreSQL에서 자동 증분 기본 키를 설정하는 방법은 무엇입니까?


259

PostgreSQL에 22 개의 열이있는 테이블이 있으며 자동 증가 기본 키를 추가하고 싶습니다.

idBIGSERIAL 유형 의 열을 만들려고 했지만 pgadmin이 오류로 응답했습니다.

ERROR: sequence must have same owner as table it is linked to.

누구 든지이 문제를 해결하는 방법을 알고 있습니까? 표를 다시 만들지 않고 PostgreSQL에서 자동 증가 기본 키를 어떻게 추가합니까?

답변:


292

이 명령을 시도하십시오 :

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

테이블 을 작성한 것과 동일한 DB 사용자로 시도하십시오 .


75
(여기서 핵심은 SERIAL 또는 BIGSERIAL 데이터 유형을 사용하여 장면 뒤의 시퀀스를 생성하고 삽입시이를 증분 / 사용하는 것입니다)
rogerdpack

16
다른 테이블에서 참조하려면 정수 또는 bigint
Ward

2
@satishkilari : 예, 구문은 ALTER TABLE mytable ADD PRIMARY KEY (column);입니다. Postgresql은 열에 NULL이 없는지 확인합니다.
AH

3
pgAdmin 4에서이 오류를 얻기 모두 bigserialserial 같은 오류를주고있다 :ERROR: syntax error at or near "BIGSERIAL"
ADI

5
또한 bigserial 또는 serial을 사용하여 구문 오류가 발생합니다. 이에 대한 최소 postgresql 버전이 있습니까?
dacDave

251

postgresql에서 자동 증분 기본 키 :

1 단계 : 테이블을 만듭니다.

CREATE TABLE epictable
(
    mytable_key    serial primary key,
    moobars        VARCHAR(40) not null,
    foobars        DATE
);

2 단계, 이와 같이 테이블에 값을 삽입하면 mytable_key가 첫 번째 매개 변수 목록에 지정되어 있지 않으므로 기본 시퀀스가 ​​자동 증가합니다.

insert into epictable(moobars,foobars) values('delicious moobars','2012-05-01')
insert into epictable(moobars,foobars) values('worldwide interblag','2012-05-02')

3 단계 : 표에서 *를 선택하십시오.

el@voyager$ psql -U pgadmin -d kurz_prod -c "select * from epictable"

4 단계 : 출력을 해석하십시오.

mytable_key  |        moobars        |  foobars   
-------------+-----------------------+------------
           1 | delicious moobars     | 2012-05-01
           2 | world wide interblags | 2012-05-02
(2 rows)

mytable_key 열이 자동으로 증가했는지 확인하십시오.

프로 팁 :

postgresql은 내부적으로 해시 테이블 구조를 사용하여 삽입, 삭제, 업데이트 및 선택 속도를 높이기 때문에 항상 테이블에서 기본 키를 사용해야합니다. 기본 키 열 (고유하고 null이 아닌)을 사용할 수있는 경우 해시 함수에 고유 한 시드를 제공하도록 의존 할 수 있습니다. 기본 키 열을 사용할 수없는 경우 해시 함수는 다른 열 집합을 키로 선택하므로 비효율적입니다.


21
사소한 nitpick 은 무대 뒤에서 다음을 SERIAL만듭니다 sequence: postgresql.org/docs/9.2/static/…
carbocation

1
새 열을 추가하지 않고 테이블에 기본 키 (기존 열)를 만들 수
있습니까

외래 키가 thing_id int references epictable(mytable_key)작동합니까?

36

커스텀 시퀀스를 사용하여 postgresql에서 자동 증분 기본 키를 만듭니다.

1 단계 : 시퀀스 생성

create sequence splog_adfarm_seq
    start 1
    increment 1
    NO MAXVALUE
    CACHE 1;
ALTER TABLE fact_stock_data_detail_seq
OWNER TO pgadmin;

2 단계, 테이블 만들기

CREATE TABLE splog_adfarm
(
    splog_key    INT unique not null,
    splog_value  VARCHAR(100) not null
);

3 단계, 테이블에 삽입

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'), 
    'Is your family tree a directed acyclic graph?'
);

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'), 
    'Will the smart cookies catch the crumb?  Find out now!'
);

4 단계, 행 관찰

el@defiant ~ $ psql -U pgadmin -d kurz_prod -c "select * from splog_adfarm"

splog_key |                            splog_value                             
----------+--------------------------------------------------------------------
        1 | Is your family tree a directed acyclic graph?
        2 | Will the smart cookies catch the crumb?  Find out now!
(3 rows)

두 행에는 시퀀스가 ​​정의한대로 1부터 시작하여 1 씩 증가하는 키가 있습니다.

보너스 엘리트 프로 팁 :

프로그래머는 타이핑을 싫어하고 타이핑하는 nextval('splog_adfarm_seq')것은 성가신 일입니다. DEFAULT대신 다음과 같이 해당 매개 변수를 입력 할 수 있습니다 .

insert into splog_adfarm values (
    DEFAULT, 
    'Sufficient intelligence to outwit a thimble.'
);

위의 작업을 수행하려면 splog_adfarm 테이블에서 해당 키 열의 기본값을 정의해야합니다. 더 예쁘다.


2
맞춤 시퀀스의 장점은 무엇입니까? 아마 보안?
Léo Léopold Hertz 준영

1
@Masi 사용자 지정 시퀀스를 사용하면 마스터-마스터 복제를보다 쉽게 ​​수행 할 수 있습니다. 두 데이터 센터 간의 데이터 링크가 끊어진 경우에 유용합니다. 서로 다른 ID를 가진 두 서버에서 레코드를 만들 수 있습니다. 그런 다음 생성 된 ID를 별도의 위치에 유지하면서 데이터베이스를 쉽게 동기화 할 수 있습니다.
Vincent McNabb

16

pgadmin에서이 작업을 수행하려면 훨씬 쉽습니다. postgressql에서 자동 증분을 열에 추가하려면 먼저 자동 증분 시퀀스를 생성하고 필요한 열에 추가해야합니다. 나는 이것을 좋아했다.

1) 먼저 테이블의 기본 키가 있는지 확인해야합니다. 또한 기본 키의 데이터 유형을 bigint 또는 smallint로 유지하십시오. (나는 bigint를 사용했고 다른 곳에서 언급 한 것처럼 serial이라는 데이터 유형을 찾을 수 없었습니다)

2) 그런 다음 sequence-> 새 시퀀스 추가를 마우스 오른쪽 버튼으로 클릭하여 시퀀스를 추가하십시오 . 테이블에 데이터가없는 경우 순서대로 그대로두고 변경하지 마십시오. 그냥 저장하십시오. 기존 데이터가있는 경우 기본 키 열의 마지막 또는 가장 높은 값을 아래 표시된대로 정의 탭의 현재 값에 추가하십시오. 여기에 이미지 설명을 입력하십시오

3) 마지막으로 nextval('your_sequence_name'::regclass)아래 표시된 것처럼 기본 키의 기본값에 줄 을 추가하십시오 .

여기에 이미지 설명을 입력하십시오 여기에서 시퀀스 이름이 올바른지 확인하십시오. 이것이 전부이며 자동 증분이 작동해야합니다.


9

시퀀스에서 숫자를 사용하려면 다음과 같이 새 시퀀스를 정의하십시오.

CREATE SEQUENCE public.your_sequence
    INCREMENT 1
    START 1
    MINVALUE 1
;

그런 다음 id의 시퀀스를 사용하도록 테이블을 변경하십시오.

ALTER TABLE ONLY table ALTER COLUMN id SET DEFAULT nextval('your_sequence'::regclass);

모든 테이블에 대해 새 시퀀스를 만들어야합니까?
Bharat Chhabra

다른 테이블에 대해 동일한 시퀀스를 공유 할 수 있지만 각 테이블의 각 레코드에 대해 시퀀스가 ​​증가합니다.
acaruci

1

PostgreSQL에서 기본 키를 성공적으로 자동 증가시키기 위해 다음 스크립트를 시도했습니다.

CREATE SEQUENCE dummy_id_seq
    START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

CREATE table dummyTable (
    id bigint DEFAULT nextval('dummy_id_seq'::regclass) NOT NULL,
    name character varying(50)
);

편집하다:

CREATE table dummyTable (
    id SERIAL NOT NULL,
    name character varying(50)
)

SERIAL 키워드는 각 열에 대한 시퀀스를 자동으로 만듭니다.


SEQUENCE와 마찬가지로 SERIAL을 재설정 할 수 있습니까?
Thoroc

1
네! 확인 ALTER SEQUENCE dummytable_id_seq RESTART WITH 1;하고 작동합니다.
Asad Shakeel

0

어쩌면 나는이 질문에 대답하기에 약간 늦었지만 내 직업 에서이 주제를 연구하고 있습니다. :)

'a_code'열 = c1, c2, c3, c4를 작성하고 싶었습니다.

먼저 이름 ref_id과 유형 으로 열을 열었습니다 serial. 그런 다음이 명령으로 내 문제를 해결했습니다.

update myschema.mytable set a_code=cast('c'||"ref_id" as text) 

새 열을 추가하지 않고 테이블에 기본 키 (기존 열)를 만들 수
있습니까
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.