【发布时间】:2021-10-09 09:33:58
【问题描述】:
我正在尝试在 Postgres 13.3 中创建以下表格:
CREATE TABLE IF NOT EXISTS accounts (
account_id Integer PRIMARY KEY NOT NULL
);
CREATE TABLE IF NOT EXISTS users (
user_id Integer PRIMARY KEY NOT NULL,
account_id Integer NOT NULL REFERENCES accounts(account_id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS calendars (
calendar_id Integer PRIMARY KEY NOT NULL,
user_id Integer NOT NULL,
account_id Integer NOT NULL,
FOREIGN KEY (user_id, account_id) REFERENCES users(user_id, account_id) ON DELETE CASCADE
);
但创建日历表时出现以下错误:
ERROR: there is no unique constraint matching given keys for referenced table "users"
这对我来说没有多大意义,因为外键包含 user_id,它是 users 表的 PK,因此也具有唯一性约束。如果我像这样在组合的 user_id 和 account_id 上添加显式唯一性约束:
ALTER TABLE users ADD UNIQUE (user_id, account_id);
然后我就可以创建日历表了。这个唯一约束对我来说似乎没有必要,因为 user_id 已经是唯一的。有人可以向我解释一下我在这里缺少什么吗?
【问题讨论】:
-
有什么特殊原因要使用原子 PK 为表创建复合 FK 吗?
-
account_id不是users上的唯一键。如果您想要一个 n-n 关系,请考虑一个中间表。 -
日历表的含义/意图是什么?
-
我使用复合 FK 的原因是因为我想确保 calendars 表中的 account_id 与 user_id 日历属性引用的用户的 account_id 相同。我的代码中有一个错误,其中日历上的 account_id 是用户不是其成员的帐户,因此我想使用架构强制执行此操作。
-
@wildplasser 日历是我的架构的一部分,用于对日历事件进行分组(我没有在此处添加)。一个用户可以拥有多个日历,但一个日历只能由一个用户拥有。所以这是一个 1-n 关系
标签: postgresql database-design foreign-keys