2009-08-17 13 views
54

Birleşik anahtar oluştururken sözdizimi hatasını anlamıyorum. Mantık hatası olabilir, çünkü birçok çeşidi test ettim.Postgres: Kompozit anahtarlar nasıl yapılır?

Postgres'te bileşik anahtarlar nasıl oluşturulur?

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, 
         ^

cevap

80

Kişisel bileşik PRIMARY KEY şartname zaten istediğini yapar. seni de yazım hatası veriyor çizgi atlayın ve (zaten zımni) gereksiz CONSTRAINT ihmal: Eğer alıyorsanız hata hattında 3'te ise

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

nasıl "KISITLAMA (Tag1, TAG2, TAG3) İÇİN TAG_ID GELEN EŞSİZ REFERANS no_duplicate_refences" gibi bir contraint uygulamak? –

+1

@Masi, Burada modellemeye çalıştığınız şeyi yeterince anlayamadım ve açıkçası, 'tag1' - 'tag3' sütunları, daha fazla tasarım geliştirmesi yapabileceğinizi gösteriyor. Belki de, modelinizin doğal dil tanımlaması ve birkaç örnek kayıt ile ayrı bir soru yardımcı olacaktır. – pilcrow

9

o

CONSTRAINT no_duplicate_tag UNIQUE (question_id, tag_id) 
değil yani

ama daha erken:

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

Ben kesinlikle hiçbir fikri neden oraya koydun var - amaç nedir? mantık nedir?

Neyse. Doğru tablo tanımı pilcrow'un gösterdiği gibidir. Eğer arzu göre adlandırılmış kısıtlamayı yapmak istiyorsanız,

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) 
); 

ya: Eğer (çok şüpheli geliyor) tag1, tag2, TAG3 benzersiz eklemek istiyorsanız

, sonra sözdizimi :

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) 
);