Postgres: come eseguire le chiavi composite?


111

Non riesco a capire l'errore di sintassi nella creazione di una chiave composta. Potrebbe essere un errore logico, perché ho testato molte varietà.

Come si creano chiavi composite in 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,
                          ^

Risposte:


171

La tua PRIMARY KEYspecifica del composto fa già quello che vuoi. Ometti la riga che ti dà un errore di sintassi e ometti anche il ridondante CONSTRAINT(già implicito):

 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)

Come implementeresti un limite come "CONSTRAINT no_duplicate_refences RIFERIMENTO UNICO DA tag_id A (tag1, tag2, tag3)"?
Léo Léopold Hertz 준영

4
@ Masi, non credo ho capito abbastanza di ciò che si sta cercando di modellare qui, e, ad essere sinceri, le colonne tag1attraverso tag3suggerire a me che si potrebbe avere ulteriori perfezionamenti progettuali da fare. Forse una domanda separata, con una descrizione in linguaggio naturale del tuo modello e alcuni record di esempio, potrebbe aiutare.
pilcrow

18

L'errore che stai ricevendo è nella riga 3. cioè non è in

CONSTRAINT no_duplicate_tag UNIQUE (question_id, tag_id)

ma prima:

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

La definizione corretta della tabella è come mostrato da pilcrow.

E se vuoi aggiungere univoco su tag1, tag2, tag3 (che sembra molto sospetto), la sintassi è:

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

oppure, se vuoi che il vincolo venga nominato secondo il tuo desiderio:

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)
);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.