我有可以分配团队成员和人员的团队。团队表和人员表已经存在且无法触及,我正在创建连接表来分配团队成员和团队负责人。
我有一个关键约束,团队领导必须是团队成员,只要有人被指派为团队成员,就不可能将他们作为团队成员删除。
我的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用于我们的测试,但如果可能的话,我们不希望与数据库绑定。
答案 0 :(得分:1)
这个SQL约束不应该在这里:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
tools:ignore="MergeRootFrame">
<WebView
android:id="@+id/activity_main_webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
您的数据模型似乎有误:团队负责人不应该将外键指向团队成员,而应该指向团队。
您能否发布完整的架构,以便我们提供更完整的答案?