外键约束禁止级联删除
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 完整的架构,以便我们提供更完整的答案?
我有可以分配团队成员和人员的团队。团队 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 完整的架构,以便我们提供更完整的答案?