1

我试图在 2 个分区表之间添加外键,它给了我错误(没有唯一约束匹配给定键的引用表“用户”)我使用 postgresql v13,pgAdmin 4.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);
4

2 回答 2

0

您不能有唯一约束id(每个主键或唯一约束都必须包含value),因此您也不能在外键中引用该列。

拥有外键约束的唯一解决方案是将其添加valuetest外键定义中并将其包含在外键定义中。

没有解决方法。

顺便说一句,您永远不应该将表命名user为保留的 SQL 关键字。

于 2020-10-19T10:56:24.250 回答
0

大概,您打算:

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。
于 2020-10-19T11:07:26.800 回答