【发布时间】:2015-08-18 20:34:49
【问题描述】:
我的团队可以分配团队成员和人员。团队表和人员表已存在且无法触及,我正在创建联接表以分配团队成员和团队领导。
我有一个关键约束,团队负责人必须是团队成员,只要有人被指定为团队负责人,就不可能将他们作为团队成员移除。
我的 sql 看起来像这样(从更复杂的表翻译,如果我的示例输入错误,请原谅我,因为我是手动编写的)
CREATE TABLE TEAM_MEMBERS (id BIGINT NOT NULL,
teamId BIGINT NOT NULL,
personId BIGINT NOT NULL,
PRIMARY KEY (id),
KEY (teamId),
KEY (personId)
CONSTRAINT fk_team FOREIGN KEY (teamId) REFERENCES TEAM(id) ON DELETE CASCADE);
CREATE TABLE TEAM_LEAD (id BIGINT NOT NULL,
teamId BIGINT NOT NULL,
personId BIGINT NOT NULL,
PRIMARY KEY (id),
KEY (teamId),
KEY (personId),
CONSTRAINT fk_team_u FOREIGN KEY (teamId) REFERENCES TEAM (id) ON DELETE CASCADE,
CONSTRAINT fk_child FOREIGN KEY (teamId, personId) REFERENCES TEAM_MEMBERS(teamId, personId)) ON DELETE RESTRICT;
这不起作用。当一个团队被删除时,我会遇到约束违规,因为它首先将删除级联到 team_members,然后尝试删除它,然后发现 team_lead 正在阻止它。
我的问题,有没有一种简单的方法在这里表达某种操作顺序,让 sql 明白它应该首先删除团队领导,或者理解如果它完全级联删除它不是约束违规?
我意识到一种解决方案是让 teamLead 成为 team_members 上的布尔值,而不是单独的连接表。由于各种原因,我不想这样做,但如果没有其他更清洁的解决方案,也可以这样做。
我们在服务器上使用 PostgreSQL,H2 用于我们的测试,但如果可能的话,我们不希望被绑定到数据库。
【问题讨论】:
-
"如果可能的话,我们不希望被绑定到数据库" - 您是否以不绑定到 Web 的方式创建 Web 应用程序 -框架?或者您的 GUI/桌面应用程序,以便您不依赖于 GUI 框架?还是您的应用程序本身不依赖于特定的编程语言?
-
为什么不在 team_members 上有一个名为 IsTeamLead 的布尔列?我不明白你为什么需要一个单独的 team_lead 表。
-
您是否有理由不简单地将
fk_child约束移动到TEAM_MEMBERS并反转它?CONSTRAINT fk_parent FOREIGN KEY (teamId, personId) REFERENCES TEAM_LEAD(teamId, personId)) ON DELETE SET DEFAULT;还是我只是遗漏了一些明显的东西?
标签: sql postgresql h2