外键约束禁止级联删除

时间:2015-08-18 20:34:50

标签: sql postgresql h2

我有可以分配团队成员和人员的团队。团队表和人员表已经存在且无法触及,我正在创建连接表来分配团队成员和团队负责人。

我有一个关键约束,团队领导必须是团队成员,只要有人被指派为团队成员,就不可能将他们作为团队成员删除。

我的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用于我们的测试,但如果可能的话,我们不希望与数据库绑定。

1 个答案:

答案 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>

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

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