Postgres:如何做复合键?

Léo*_* 준영 92 sql postgresql composite-key

我无法理解创建复合键时的语法错误.这可能是一个逻辑错误,因为我已经测试了许多品种.

如何在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,
                          ^
Run Code Online (Sandbox Code Playgroud)

pil*_*row 145

您的化合物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)
Run Code Online (Sandbox Code Playgroud)

  • @Masi,我认为我不太了解你在这里要模拟的内容,而且坦率地说,"tag1"到"tag3"这一列向我建议你可以进行进一步的设计改进.也许一个单独的问题,对您的模型的自然语言描述和一些示例记录,将有所帮助. (4认同)

小智 15

你得到的错误在第3行.即它不在

CONSTRAINT no_duplicate_tag UNIQUE (question_id, tag_id)
Run Code Online (Sandbox Code Playgroud)

但早些时候:

CREATE TABLE tags
     (
              (question_id, tag_id) NOT NULL,
Run Code Online (Sandbox Code Playgroud)

我完全不知道你为什么把它放在那里 - 目的是什么?逻辑是什么?

无论如何.正确的表定义就像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)
);
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要根据您的意愿命名约束:

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)
);
Run Code Online (Sandbox Code Playgroud)