PostgreSQL에서 기존 인덱스를 기본 키로 승격시키는 방법


13

테이블 내에서 기본 키를 만드는 방법을 알고 있지만 기존 인덱스를 기본 키로 만들려면 어떻게해야합니까? 한 데이터베이스에서 다른 데이터베이스로 기존 테이블을 복사하려고합니다. 표를 표시하면 맨 아래의 색인은 다음과 같은 형식입니다.

"my_index" PRIMARY KEY, btree (column1, column2)

나는 다음을 사용하여 색인을 만들었습니다.

CREATE INDEX my_index ON my_table (column1, column2)

그러나 기본 키를 만드는 방법을 모르겠습니다 ...

업데이트 : 내 서버 버전은 8.3.3입니다.


1
my_index가 기본 키의 이름으로 표시되면 이미 색인 있는 것입니다. Postgres에는 (독특한) 인덱스가없는 PK가 없습니다
a_horse_with_no_name

1
PostgreSQL 버전은 무엇입니까?
filiprem

나는 8.3.3 실행 해요
WildBill

답변:


16

ALTER TABLE을 사용하여 기본 키 제약 조건 을 추가합니다 . Postgres에서는 " ALTER TABLE .. ADD table_constraint_using_index"양식을 사용하여 색인을 "승격"할 수 있습니다

인덱스는 기본 키에 대해 고유해야합니다.

ALTER TABLE my_table 
    ADD CONSTRAINT PK_my_table PRIMARY KEY USING INDEX my_index;

그것은 나를 위해 작동하지 않았다. PK_my_table은 무엇입니까? 나는 이것이 레이블이라고 가정하고 테이블 이름에 'PK_'를 추가합니까? "오류 : 문자 83에서"USING "또는 그 근처에 구문 오류가 있음"이라는 구문 오류가 있습니다.
WildBill

1
@ngramsky : USING INDEX9.1부터 사용할 수 있습니다. 난 당신이 현재 버전 실행하지 않는 것 같아요 그래서
a_horse_with_no_name

아니요, 8.3.3을 사용하고 있습니다. 8.3.3에서 어떻게합니까?
WildBill

5
그 고대 버전에서 그것을 수행하는 유일한 방법은 인덱스를 삭제하고 새로운 pk 제약 조건을 추가하는 것입니다.
a_horse_with_no_name

2
@a_horse_with_no_name : 당신은 대답을해야합니다 : 당신의 의견은 다른 대답보다 우선합니다 ...
gbn

7

postgresql의 해당 버전에서 인덱스를 기본 키로 변환 할 수 있다고 생각하지 않습니다.

기존 인덱스를 삭제하고 지정한 열을 사용하여 기본 키를 만듭니다. :

DROP INDEX my_index;
ALTER TABLE ONLY my_table ADD CONSTRAINT pk_my_table PRIMARY KEY(column1,column2);

7.4와 8.4에서 일함


btw, "테이블 이름 앞에 ONLY를 지정하면 해당 테이블 만 변경됩니다. ONLY를 지정하지 않으면 테이블과 모든 하위 테이블 (있는 경우)이 변경됩니다."
Paolo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.