PostgreSQL 테이블이 이미 생성 된 후 UNIQUE 제약 조건을 추가 할 수 있습니까?


185

다음 테이블이 있습니다.

 tickername | tickerbbname  | tickertype
------------+---------------+------------
 USDZAR     | USDZAR Curncy | C
 EURCZK     | EURCZK Curncy | C
 EURPLN     | EURPLN Curncy | C
 USDBRL     | USDBRL Curncy | C
 USDTRY     | USDTRY Curncy | C
 EURHUF     | EURHUF Curncy | C
 USDRUB     | USDRUB Curncy | C

주어진 tickername/ tickerbbname쌍에 대해 둘 이상의 열이있는 것을 원하지 않습니다 . 이미 테이블을 만들고 테이블에 많은 데이터가 있습니다 (이미 고유 한 기준을 충족하도록 보장했습니다). 그러나 커질수록 오류가 발생할 여지가 있습니다.

UNIQUE이 시점에서 제약 조건 을 추가하는 방법 이 있습니까?


답변:


363

psql인라인 도움말 :

\h ALTER TABLE

또한 postgres 문서 (훌륭한 자료 및 읽기 쉬운 문서)에 문서화되어 있습니다.

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns);

6
감사합니다 @hhaamu. 네는 문서를 시도했지만 위의 내용은 훨씬 간결합니다.
Thomas Browne

117
PostgreSQL이 색인 이름을 생성하게하려면을 사용하십시오 ALTER TABLE tablename ADD UNIQUE (columns);. ( CONSTRAINT키워드는 생략해야합니다.)
jpmc26

5
나는이 질문에 대한 답이 필요했고 문서에 대한 인터넷 검색을 시작했습니다. Postgres 설명서 대신 StackOverflow 에서이 주제를 다루었습니다. 따라서 공식 문서를 참조하는 것이 좋지만 향후 방문에 대한 답변을 제공하는 것도 좋습니다. 고마워
레너드

@ jpmc26«PostgreSQL이 인덱스 이름을 생성하게하려면»제약 조건 이름을 의미합니까?
tuxayo

4
@tuxayo, 고유 제약 조건은 Postgres의 색인을 통해 구현됩니다 (페단 틱하지 않아야 함).
Chris W.

36

그래 넌 할수있어. 그러나 테이블에 고유하지 않은 항목이 있으면 실패합니다. 다음은 테이블에 고유 제한 조건을 추가하는 방법입니다. PostgreSQL 9.x를 사용하는 경우 아래 지침을 따르십시오.

CREATE UNIQUE INDEX constraint_name ON table_name (columns);

3
고마워 Zeck-좋은 2y 나중에 대답하지만 사람들이 여전히 시간을내어 주셔서 감사합니다! 톰
토마스 브라운

1
맞지 않습니다. 최신 Postgres에서는 고유하지 않은 값이있는 경우 "키 (uuid) = (3a533772-07ac-4e76-b577-27a3878e2222)가 복제되었습니다. 쿼리 실패"와 같은 메시지가 표시됩니다.
Strinder

3
@Strinder, 그게 어떻게 좋지 않은가요? 복제 된 데이터를 먼저 수정하십시오.
Jasen

3
@Jasen 그것은 분명하다. "하지만 테이블에 고유하지 않은 항목이있는 경우 테이블에 고유 제한 조건을 추가하는 방법"이 있습니다. 작동 안 할 것이다. 고유하지 않은 항목은 항상 미리 통합해야합니다.
Strinder

명확성을 위해 답변을 편집 함
Xavier Ho

6

이름과성에 따라 기존 제약 조건이 이미있는 테이블이 있고 고유 제약 조건을 하나 더 추가하려면 다음과 같이 전체 제약 조건을 삭제해야합니다.

ALTER TABLE your_table DROP CONSTRAINT constraint_name;

추가하려는 새 제약 조건이 해당 테이블의 모든 데이터에서 고유하거나 null이 아닌지 (Microsoft Sql의 경우 하나의 null 값만 포함 할 수 있음) 확인한 다음 다시 만들 수 있습니다.

ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n);

5

예, 사실 뒤에 UNIQUE 제약 조건을 추가 할 수 있습니다. 그러나 테이블에 고유하지 않은 항목이 있으면 Postgres는 수정할 때까지 이에 대해 불평합니다.


7
select <column> from <table> group by 1 having count(*) > 1;중복 값에 대한 보고서를 제공합니다.
Jasen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.