Postgres: Як зробити складені ключі?


111

Я не можу зрозуміти помилку синтаксису при створенні складеного ключа. Це може бути логічна помилка, тому що я перевірив багато різновидів.

Як створювати складові ключі в 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,
                          ^

Відповіді:


171

Ваша складова 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)

Як би ви реалізували контрант на зразок "CONSTRAINT no_duplicate_refences УНІКАЛЬНА СПРАВКА від tag_id TO (tag1, tag2, tag3)"?
Лео Леопольд Герц 준영

4
@Masi, я не думаю , що я розумію , досить того , що ви намагаєтеся змоделювати тут, і, відверто кажучи , стовпці tag1через tag3запропонувати мені , що ви могли б мати додаткові конструктивні удосконалення , щоб зробити. Можливо, допоможе окреме запитання з натуральним мовним описом вашої моделі та кількома прикладними записами.
стовп

18

Помилка, яку ви отримуєте, знаходиться в рядку 3, тобто вона не в

CONSTRAINT no_duplicate_tag UNIQUE (question_id, tag_id)

але раніше:

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

Правильне визначення таблиці, як показала стовпчик.

І якщо ви хочете додати унікальний на 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),
    UNIQUE (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)
);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.