后记: 如何做复合键?

我无法理解创建复合键时的语法错误。这可能是一个逻辑错误,因为我已经测试了许多品种。

如何在 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,
^
188895 次浏览

您的复合 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,

正确的表定义是像皮尔克罗显示。

如果您想在 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)
);