【问题标题】:Postgres: How to do Composite keys?Postgres:如何做复合键?
【发布时间】:2010-11-20 03:14:00
【问题描述】:

我无法理解创建复合键时的语法错误。可能是逻辑错误,因为我测试过很多品种。

如何在 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,
                          ^

【问题讨论】:

    标签: sql postgresql composite-key


    【解决方案1】:

    您的复合 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)”的约束?
    • @Masi,我认为我对您在这里尝试建模的内容还不够了解,坦率地说,tag1tag3 的列向我建议您可能有进一步的设计改进要做。也许一个单独的问题,对您的模型进行自然语言描述和一些示例记录,会有所帮助。
    【解决方案2】:

    你得到的错误在第 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)
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多