Postgres:如何做复合键?

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

你如何在Postgres中创build复合键?

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, ^ 

你的复合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) );