PostgreSQL에서 자동 증가 기본 키를 기존 테이블에 추가하는 방법은 무엇입니까?


190

기존 데이터가있는 테이블이 있습니다. 테이블을 삭제하고 다시 만들지 않고 기본 키를 추가하는 방법이 있습니까?

답변:


355

( 업데이트-댓글을 남긴 사람들 덕분에 )

최신 버전의 PostgreSQL

test1자동 증분 기본 키 id(대리) 열 을 추가하려는 테이블이 있다고 가정합니다 . 최신 버전의 PostgreSQL에서는 다음 명령으로 충분합니다.

   ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;

이전 버전의 PostgreSQL

이전 버전의 PostgreSQL (8.x 이전)에서는 모든 더러운 작업을 수행해야했습니다. 다음과 같은 일련의 명령으로 트릭을 수행해야합니다.

  ALTER TABLE test1 ADD COLUMN id INTEGER;
  CREATE SEQUENCE test_id_seq OWNED BY test1.id;
  ALTER TABLE test ALTER COLUMN id SET DEFAULT nextval('test_id_seq');
  UPDATE test1 SET id = nextval('test_id_seq');

다시 말하지만, 최근 Postgres 버전에서는 위의 단일 명령과 거의 같습니다.


3
ORACLE을 사용하고 있으므로 공유하는 것이 ORACLE 사용자에게 유용 할 수 있습니다. ORACLE : ALTER TABLE TEST1 ADD ID NUMBER; 업데이트 테스트 1 SET ID = TEST1_SEQ.NEXTVAL; 테이블 테스트 1 변경 기본 키 추가 (ID); UPDATE 문을 실행하기 전에 시퀀스 TEST1_SEQ 만들기
msbyuva

참고 ADD PRIMARY KEY또한 생성 NOT NULL제약은 예상하고 원하는대로 (포스트 그레스 9.3에서 테스트).
Jared Beck

19
Postgres에서는 단일 명령을 사용할 수 있습니다ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
resnyanskiy

1
@resnyanskiy의 의견 외에도 테이블에 데이터가있는 경우에도 작동합니다. ID가 채워지고 널 (null) 제한 조건이 설정되지 않았습니다. 전체 답변은 해당 의견의 줄로 바꿀 수 있습니다.
Synesso

1
@EricWang 감사합니다. Eric, 맞습니다. 몇 년 전에는 작동하지 않았지만 확실하지 않습니다. 답변을 커뮤니티 위키로 바꿨습니다.
leonbloy

57
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;

이것은 당신이해야 할 모든 것입니다 :

  1. id열 추가
  2. 1부터 count (*)까지의 순서로 채 웁니다.
  3. 기본 키로 설정합니다. null이 아닙니다.

댓글에이 답변을 준 @resnyanskiy에게 크레딧이 제공됩니다.


2
이것은 대답으로 표시되어야하고, 대답은 @resnyanskiy에 속해야
에릭 왕을

먼저 pkey를 떨어 뜨린 다음이를 실행해야했습니다. ALTER TABLE <table> DROP CONSTRAINT <pkey_name>;
Josh Robertson

10

v10에서 ID 열을 사용하려면

ALTER TABLE test 
ADD COLUMN id { int | bigint | smallint}
GENERATED { BY DEFAULT | ALWAYS } AS IDENTITY PRIMARY KEY;

신원 열에 대한 설명은 https://blog.2ndquadrant.com/postgresql-10-identity-columns/를 참조 하십시오 .

GENERATED BY DEFAULT와 GENERATED ALWAYS의 차이점은 https://www.cybertec-postgresql.com/en/sequences-gains-and-pitfalls/를 참조 하십시오 .

순서를 변경하려면 https://popsql.io/learn-sql/postgresql/how-to-alter-sequence-in-postgresql/을 참조 하십시오 .


이 솔루션의 문제점은 테이블에 이미 행이 포함 된 경우 오류가 발생 SQL Error [23502]: ERROR: column "id" contains null values
한다는 것입니다

3
@isapir :이 오류를 생성하는 초기 버전 (pg 10 및 10.1)에 버그가있었습니다. pg 10.2로 수정되었습니다. 자세한 내용은 여기 : dba.stackexchange.com/q/200143/3684
Erwin Brandstetter

감사합니다 @ erwin-brandstetter
isapir

1 년 후 나는이 대답을 다시 발견했다. 버그는 분명히 수정되고
상향 조정되었다

2

나도 그런 것을 찾고 있었기 때문에 여기에 도착했다. 필자의 경우 행 ID를 대상 테이블에 할당하면서 많은 열이있는 준비 테이블 세트의 데이터를 하나의 테이블로 복사했습니다. 여기 내가 사용한 위의 접근 방식의 변형이 있습니다. 대상 테이블 끝에 직렬 열을 추가했습니다. 그렇게하면 Insert 문에 자리 표시자가 없어도됩니다. 그런 다음 대상 테이블에 대한 간단한 select *가이 열을 자동으로 채 웁니다. PostgreSQL 9.6.4에서 사용한 두 개의 SQL 문은 다음과 같습니다.

ALTER TABLE target ADD COLUMN some_column SERIAL;
INSERT INTO target SELECT * from source;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.