Postgres: Bileşik anahtarlar nasıl yapılır?


112

Bileşik anahtar oluştururken sözdizimi hatasını anlayamıyorum. Mantık hatası olabilir, çünkü birçok çeşidi test ettim.

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

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

Yanıtlar:


173

Bileşik PRIMARY KEYspesifikasyonunuz zaten istediğinizi yapıyor. Size bir sözdizimi hatası veren satırı atlayın ve fazlalığı da CONSTRAINT(zaten belirtilmiş olan) atlayın :

 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)" gibi bir kontratı nasıl uygularsınız?
Léo Léopold Hertz 준영

4
@Masi, Sana burada modellemek için çalışıyoruz ne kadar anladığını sanmıyorum, ve, açıkçası, sütunlar tag1aracılığıyla tag3yapmanız gereken başka tasarım refinements sahip olabileceği bana öneriyoruz. Belki de modelinizin doğal bir dil tanımı ve birkaç örnek kayıt içeren ayrı bir soru yardımcı olabilir.
pilcrow

18

Aldığınız hata 3. satırdadır, yani

CONSTRAINT no_duplicate_tag UNIQUE (question_id, tag_id)

ama daha önce:

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

Doğru tablo tanımı pilcrow'un gösterdiği gibidir.

Ve eğer tag1, tag2, tag3'e (çok şüpheli geliyor) benzersiz eklemek istiyorsanız, sözdizimi şu şekildedir:

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

veya kısıtlamanın isteğinize göre adlandırılmasını 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),
    CONSTRAINT some_name UNIQUE (tag1, tag2, tag3)
);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.