132 votes

Postgres : Comment faire des clés composites ?

Je ne comprends pas l'erreur de syntaxe dans la création d'une clé composite. Il s'agit peut-être d'une erreur de logique, car j'ai testé de nombreuses variétés.

Comment créer des clés composites dans 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,
                          ^

208voto

pilcrow Points 20628

Votre composé PRIMARY KEY La spécification fait déjà ce que vous voulez. Omettez la ligne qui vous donne une erreur de syntaxe, et omettez la redondante CONSTRAINT (déjà sous-entendu), aussi :

 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)

24voto

L'erreur que vous obtenez se trouve à la ligne 3, c'est-à-dire qu'elle ne se trouve pas dans le fichier

CONSTRAINT no_duplicate_tag UNIQUE (question_id, tag_id)

mais plus tôt :

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

La définition correcte de la table est comme l'a montré le pilcrow.

Et si vous voulez ajouter unique sur tag1, tag2, tag3 (ce qui semble très suspect), alors la syntaxe est :

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

ou, si vous voulez que la contrainte soit nommée selon votre souhait :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X