我有一个包含以下表格的数据库:items
、categories
和category_items
. (简化,省略字段)模式如下:
CREATE TABLE IF NOT EXISTS items (
id SERIAL primary key not null,
partNo text unique not null
);
CREATE TABLE IF NOT EXISTS categories (
id SERIAL PRIMARY KEY,
name TEXT UNIQUE
);
CREATE TABLE IF NOT EXISTS category_items (
category_id SERIAL PRIMARY KEY,
partno TEXT NOT NULL,
FOREIGN KEY (partno) REFERENCES items(partno),
FOREIGN KEY (category_id) REFERENCES categories(id)
);
在我想在表中插入一条记录之前,这个模式似乎工作正常category_items
。在第一次插入时category_items
,它可以工作,但是如果我尝试插入同一类别的另一个项目,则会出现重复键错误:duplicate key value violates unique constraint "category_items_pkey" Detail: Key (category_id)=(2) already exists.
问题是,category_id
从来没有指定必须是唯一的,那么为什么这会导致约束错误呢?
这些是我试图插入的记录:
INSERT INTO category_items (category_id, partno, size) VALUES
((SELECT id FROM categories WHERE name = 'category1'), 'part1', '1"');
INSERT INTO category_items (category_id, partno, size) VALUES
((SELECT id FROM categories WHERE name = 'category1'), 'part2', '4"');
使用 PostgreSQL 14。另外,如果这很重要,我正在 sqlfiddle.com 上运行它
第三张表的设计有两个/三个问题:
category_id
不应在此表中,SERIAL
因为它对. 将新行插入表中时会自动创建值,您需要使用这些值,而不是创建新行。FOREIGN KEY
categories
categories
category_id
不应该是PRIMARY KEY
这个表的,因为您可能有一些与多个部分相关联的类别。PRIMARY KEY
是类别和部分的组合。经过以上建议,设计变为:
我认为这是一个非常简单的修复,我只是因为错过它而感到有点傻。由于 in
category_items
是category_id
PRIMARY KEY,所以它默认为 UNIQUE。我需要一个单独的 ID,category_items
如下所示: