Postgres: คีย์คอมโพสิตทำอย่างไร?


112

ฉันไม่เข้าใจข้อผิดพลาดทางไวยากรณ์ในการสร้างคีย์ผสม อาจเป็นข้อผิดพลาดทางตรรกะเนื่องจากฉันได้ทดสอบหลายพันธุ์

คุณสร้างคีย์ผสมใน 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,
                          ^

คำตอบ:


174

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éoLéopold Hertz 준영

4
@ มาซิฉันคิดว่าฉันไม่เข้าใจสิ่งที่คุณพยายามสร้างแบบจำลองที่นี่มากพอและเพื่อให้ตรงไปตรงมาคอลัมน์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.