我可以将FOREIGN KEY引用到Postgresqlv13中的分区表吗



我试图在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这样做

相关内容

  • 没有找到相关文章

最新更新