기존 데이터가있는 테이블이 있습니다. 테이블을 삭제하고 다시 만들지 않고 기본 키를 추가하는 방법이 있습니까?
답변
( 업데이트-댓글을 남긴 사람들 덕분에 )
최신 버전의 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 버전에서는 위의 단일 명령과 거의 같습니다.
답변
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
이것은 당신이해야 할 모든 것입니다 :
id
열 추가- 1부터 count (*)까지의 순서로 채 웁니다.
- 기본 키로 설정합니다. null이 아닙니다.
댓글에이 답변을 준 @resnyanskiy에게 크레딧이 제공됩니다.
답변
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/을 참조 하십시오 .
답변
나도 그런 것을 찾고 있었기 때문에 여기에 도착했다. 필자의 경우 행 ID를 대상 테이블에 할당하면서 많은 열이있는 준비 테이블 세트의 데이터를 하나의 테이블로 복사했습니다. 여기 내가 사용한 위의 접근 방식의 변형이 있습니다. 대상 테이블 끝에 직렬 열을 추가했습니다. 그렇게하면 Insert 문에 자리 표시자가 없어도됩니다. 그런 다음 대상 테이블에 대한 간단한 select *가이 열을 자동으로 채 웁니다. PostgreSQL 9.6.4에서 사용한 두 개의 SQL 문은 다음과 같습니다.
ALTER TABLE target ADD COLUMN some_column SERIAL;
INSERT INTO target SELECT * from source;