2009-08-17 16 views
54

複合キーを作成する際の構文エラーを理解できません。私は多くの品種をテストしたので、論理エラーかもしれません。Postgres:複合キーの操作方法

どのように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, 
         ^

答えて

80

あなたの化合物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) 
+0

「CONSTRAINT no_duplicate_refences tag_idから(タグ1、タグ2、タグ3)のユニークな参照」のような制約をどのように実装しますか? –

+1

@マシ、ここでモデル化しようとしていることを十分に理解しているとは思えません。正直言って、 'tag1'から' tag3'までの列は、あなたがやるべき設計の細かさがあるかもしれません。おそらく、あなたのモデルに関する自然言語の記述といくつかの例文を含む別の質問が役に立ちます。 – pilcrow

9

それは

CONSTRAINT no_duplicate_tag UNIQUE (question_id, tag_id) 
ではない、すなわち、あなたが取得しているエラーは、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) 
); 

か:あなたは(非常に怪しい音)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) 
);