我试图在2个分区表之间添加外键,但它给了我错误(引用表"user"的给定键没有唯一的约束匹配(im使用postgresqlv13,pgAdmin4.26。分区表到普通表的外键工作,普通表到分区表的错误同上。当我阅读v13文档时,它没有任何限制。有人能帮我吗?
CREATE TABLE user (
id serial,
value varchar,
PRIMARY KEY (id, value),
UNIQUE (id)
) PARTITION by LIST(value);
CREATE TABLE test (
id serial,
user_id integer,
PRIMARY KEY (id, int),
UNIQUE (int, id),
FOREIGN KEY (user_id) REFERENCES user(id)
) PARTITION by LIST(user_id);
不能对id
有唯一约束(每个主键或唯一约束都必须包含value
(,因此也不能在外键中引用该列。
具有外键约束的唯一解决方案是将value
添加到test
,并将其包含在外键定义中。
对此没有变通办法。
顺便说一下,您不应该有一个名为user
的表,因为它是一个保留的SQL关键字。
据推测,您打算:
CREATE TABLE users (
user_id int generated always as identity primary key,
value varchar,
) ;
CREATE TABLE tests (
test_id int generated always as identity,
user_id integer,
PRIMARY KEY (test_id, user_id)
FOREIGN KEY (user_id) REFERENCES user(user_id)
) ;
注:
- 我删除了分区逻辑。它似乎不是特别有用,而且会干扰表定义。分区键需要是主键的一部分
- 我将主键更改为第一个表中只有一列。
user_id
是唯一的,因此不需要复合主键 - 我将主键的名称从
id
更改为包含表名称。这样,大多数外键引用将与主键具有相同的名称 - 我把桌子的名字复数化了。这有助于避免与SQL关键字和保留字发生冲突。此外,这是有意义的,因为表包含多个实体
- 我把
serial
改成了generated always as identity
。现在建议Postgres这样做