Postgres:如何做复合键?
Posted
技术标签:
【中文标题】Postgres:如何做复合键?【英文标题】:Postgres: How to do Composite keys? 【发布时间】:2010-11-20 03:14:00 【问题描述】:我无法理解创建复合键时的语法错误。可能是逻辑错误,因为我测试过很多品种。
如何在 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,
^
【问题讨论】:
【参考方案1】:您的复合 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 UNIQUE REFERENCE FROM tag_id TO (tag1, tag2, tag3)”的约束? @Masi,我认为我对您在这里尝试建模的内容还不够了解,坦率地说,tag1
到 tag3
的列向我建议您可能有进一步的设计改进要做。也许一个单独的问题,对您的模型进行自然语言描述和一些示例记录,会有所帮助。【参考方案2】:
你得到的错误在第 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)
);
【讨论】:
以上是关于Postgres:如何做复合键?的主要内容,如果未能解决你的问题,请参考以下文章
在 postgres 中使用 sqlalchemy 访问复合数据类型