Postgres: как сделать составные ключи?
Я не могу понять синтаксическую ошибку при создании составного ключа. Это может быть логическая ошибка, потому что я испытал много сортов.
как вы создаете составные ключи в 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,
^
2 ответа:
компонент
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)
ошибка, которую вы получаете, находится в строке 3. т. е. это не в
CONSTRAINT no_duplicate_tag UNIQUE (question_id, tag_id)
но раньше:
CREATE TABLE tags ( (question_id, tag_id) NOT NULL,
Я совершенно не понимаю, почему вы его туда положили - какова цель? в чем же логика?
в любом случае. Правильное определение таблицы, как показал pilcrow.
и если вы хотите добавить уникальный на 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) );