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)」のような制約をどのように実装しますか?
レオ・レオポルド・ヘルツ준 영

4
@Masiは、私はあなたがここにモデル化しようとしているものの十分な理解とは思わない、と、率直に言って、カラムtag1を通してtag3あなたが行うには、さらにデザインの改良を持っているかもしれないことを私に示唆しています。おそらく、モデルの自然言語による説明といくつかのサンプルレコードを使用した別の質問が役立つでしょう。
ピルクロウ2009

18

あなたが得ているエラーは3行目にあります。すなわち、それはありません

CONSTRAINT no_duplicate_tag UNIQUE (question_id, tag_id)

しかし以前:

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

正しいテーブル定義は、ピルクロウが示したようなものです。

タグ1、タグ2、タグ3(非常に疑わしいように聞こえる)に一意を追加する場合、構文は次のとおりです。

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.