外键约束禁止级联删除

foreign key constraints forbiding cascading delete

我有可以分配团队成员和人员的团队。团队 table 和人员 table 已经存在,无法触及,我正在创建加入 table 以分配团队成员和团队领导。

我有一个关键约束,团队负责人必须是团队成员,只要有人被指定为团队负责人,就不可能将他们从团队成员中删除。

我的 sql 看起来像这样(从更复杂的 table 翻译而来,请原谅我打错了示例,因为我是手写的)

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 上成为一个布尔值,而不是一个单独的连接 table。出于各种原因,我不想这样做,但如果没有其他更清洁的解决方案,也可以这样做。

我们在服务器 H2 上使用 PostgreSQL 进行测试,但如果可能的话我们不希望绑定到数据库。

这个SQL约束不应该在这里:

CONSTRAINT fk_child FOREIGN KEY (teamId, personId) REFERENCES TEAM_MEMBERS(teamId, personId)) ON DELETE RESTRICT;

您的数据模型似乎有误:团队负责人不应有指向团队成员的外键,而应仅指向团队。

能否请您 post 完整的架构,以便我们提供更完整的答案?