Postgres : 복합 키를 수행하는 방법?


111

복합 키를 만들 때 구문 오류를 이해할 수 없습니다. 여러 종류를 테스트했기 때문에 논리 오류 일 수 있습니다.

Postgres에서 복합 키를 어떻게 생성합니까?

CREATE TABLE tags
     (
              (question_id, tag_id) NOT NULL,
              question_id INTEGER NOT NULL,
              tag_id SERIAL NOT NULL,
              tag1 VARCHAR(20),
              tag2 VARCHAR(20),
              tag3 VARCHAR(20),
              PRIMARY KEY(question_id, tag_id),
              CONSTRAINT no_duplicate_tag UNIQUE (question_id, tag_id)
     );
    ERROR:  syntax error at or near "("
    LINE 3:               (question_id, tag_id) NOT NULL,
                          ^

답변:


171

화합물 PRIMARY KEY사양은 이미 원하는 것을 수행합니다. 구문 오류를 제공하는 줄을 생략하고 중복 CONSTRAINT(이미 암시)도 생략합니다 .

 CREATE TABLE tags
      (
               question_id INTEGER NOT NULL,
               tag_id SERIAL NOT NULL,
               tag1 VARCHAR(20),
               tag2 VARCHAR(20),
               tag3 VARCHAR(20),
               PRIMARY KEY(question_id, tag_id)
      );

NOTICE:  CREATE TABLE will create implicit sequence "tags_tag_id_seq" for serial column "tags.tag_id"
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "tags_pkey" for table "tags"
    CREATE TABLE
    pg=> \d tags
                                         Table "public.tags"
       Column    |         Type          |                       Modifiers       
    -------------+-----------------------+-------------------------------------------------------
     question_id | integer               | not null
     tag_id      | integer               | not null default nextval('tags_tag_id_seq'::regclass)
     tag1        | character varying(20) |
     tag2        | character varying(20) |
     tag3        | character varying(20) |
    Indexes:
        "tags_pkey" PRIMARY KEY, btree (question_id, tag_id)

"CONSTRAINT no_duplicate_refences UNIQUE REFERENCE FROM tag_id TO (tag1, tag2, tag3)"와 같은 제약 조건을 어떻게 구현 하시겠습니까?
Léo Léopold Hertz 준영

4
@Masi, 나는 당신이 여기에서 모델링하려는 것에 대해 충분히 이해하지 못한다고 생각하며 솔직히 말하면 열을 tag1통해 tag3더 많은 디자인 개선이 필요하다고 제안합니다. 모델에 대한 자연어 설명과 몇 가지 예제 레코드가있는 별도의 질문이 도움이 될 것입니다.
pilcrow

18

당신이 얻는 오류는 줄 3에 ​​있습니다.

CONSTRAINT no_duplicate_tag UNIQUE (question_id, tag_id)

그러나 이전 :

CREATE TABLE tags
     (
              (question_id, tag_id) NOT NULL,

올바른 테이블 정의는 pilcrow가 보여준 것과 같습니다.

그리고 tag1, tag2, tag3 (매우 의심스러운 소리)에 고유 한 항목을 추가하려는 경우 구문은 다음과 같습니다.

CREATE TABLE tags (
    question_id INTEGER NOT NULL,
    tag_id SERIAL NOT NULL,
    tag1 VARCHAR(20),
    tag2 VARCHAR(20),
    tag3 VARCHAR(20),
    PRIMARY KEY(question_id, tag_id),
    UNIQUE (tag1, tag2, tag3)
);

또는 원하는대로 제약 조건 이름을 지정하려는 경우 :

CREATE TABLE tags (
    question_id INTEGER NOT NULL,
    tag_id SERIAL NOT NULL,
    tag1 VARCHAR(20),
    tag2 VARCHAR(20),
    tag3 VARCHAR(20),
    PRIMARY KEY(question_id, tag_id),
    CONSTRAINT some_name UNIQUE (tag1, tag2, tag3)
);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.