当前位置: 首页 > 知识库问答 >
问题:

多列外键:将单个列设置为Null“on Delete”而不是全部

吴高畅
2023-03-14

example/SQL:下面的SQL说明了这个示例,但是最后一个语句将不起作用,因为最后一个外键要求lectureId和groupId都是可空的,但是使这两个都为可空意味着删除组也将lectureId设置为空。

CREATE TABLE lectures (
  lectureId INT NOT NULL,
  title VARCHAR(10) NOT NULL,
  PRIMARY KEY (lectureId)
 );

CREATE TABLE groups (
  lectureId INT NOT NULL,
  groupNo INT NOT NULL,
  title VARCHAR(10) NOT NULL,
  PRIMARY KEY (lectureId,groupNo),
  FOREIGN KEY (lectureId) REFERENCES lectures (lectureId)
    ON UPDATE CASCADE ON DELETE CASCADE
 );

CREATE TABLE studentListed (
  studentId INT NOT NULL,
  lectureId INT NOT NULL,
  groupNo INT NULL,
  PRIMARY KEY (studentId,lectureId),
  FOREIGN KEY (lectureId) REFERENCES lectures (lectureId)
    ON UPDATE CASCADE ON DELETE CASCADE,
  FOREIGN KEY (lectureId,groupNo) REFERENCES groups (lectureId,groupNo)
    ON UPDATE CASCADE ON DELETE SET NULL
 );

共有1个答案

苏浩瀚
2023-03-14

经过一些研究,似乎不能使用外键来实现这个特定的需求。

最好的解决方案似乎是混合使用外键和触发器。

对于给定的示例,问题可以通过以下语句解决:

CREATE TABLE lectures (
  lectureId INT NOT NULL,
  title VARCHAR(10) NOT NULL,
  PRIMARY KEY (lectureId)
 );

CREATE TABLE groups (
  lectureId INT NOT NULL,
  groupNo INT NOT NULL,
  title VARCHAR(10) NOT NULL,
  PRIMARY KEY (lectureId,groupNo),
  FOREIGN KEY (lectureId) REFERENCES lectures (lectureId)
    ON UPDATE CASCADE ON DELETE CASCADE
 );

CREATE TABLE studentListed (
  studentId INT NOT NULL,
  lectureId INT NOT NULL,
  groupNo INT NULL,
  PRIMARY KEY (studentId,lectureId),
  FOREIGN KEY (lectureId) REFERENCES lectures (lectureId) 
    ON UPDATE CASCADE ON DELETE CASCADE,
  FOREIGN KEY (lectureId,groupNo) REFERENCES groups (lectureId,groupNo)
    ON UPDATE CASCADE ON DELETE CASCADE
 );

CREATE TRIGGER GroupDelete BEFORE DELETE ON groups
FOR EACH ROW
  UPDATE studentListed SET studentListed.groupNo = NULL
    WHERE studentListed.lectureId = OLD.lectureId
    AND studentListed.groupNo = OLD.groupNo;
 类似资料:
  • 问题内容: 我正在为客户/订单系统定义一个数据库,其中有两种高度不同的客户类型。因为它们是如此不同,所以只有一个客户表会非常丑陋(因为空列对于一种类型是毫无意义的,所以充满了空列)。 他们的订单虽然格式相同。我的订单表中是否可以有一列同时具有两种客户类型的外键?我已经在SQL Server中进行了设置, 创建 关系没有问题,但是我还没有尝试插入任何数据。 另外,我正在计划将nHibernate用作

  • 我尝试使用liquibase使用liquibase“addDefaultValue”语法将我的列的默认值设置为null: 但是向myTable插入新行显示默认值仍然设置为“false”,就像以前一样。所以liquibase更改集不起作用。 如何设置列默认值为null与liquibase?

  • 问题内容: 我与用户和角色之间有一个多对多的关系,并带有一个role_user表。我的迁移设置如下(简化): table: table: table: 因此,根据文档,我将我的外键设置为unsigned。 现在,我添加了几个用户,并附加了一些角色- 一切正常。但是,当我删除一个用户()时,该用户在表中的行不会被删除,这导致了多余的行。 我究竟做错了什么? MySQL + InnoDB 编辑:抓取模

  • 问题内容: 我有一个表,其中有几个ID列指向其他表。 我希望 只有 在将数据放入其中时,外键才能强制完整性。如果我稍后进行更新以填充该列,则它还应该检查约束。 (这可能取决于数据库服务器,我使用的是MySQL和InnoDB表类型) 我相信这是一个合理的期望,但是如果我错了,请纠正我。 问题答案: 是的,您只能在值不为NULL时强制执行约束。可以使用以下示例轻松测试它: 第一次插入将通过,因为我们在

  • 我有一个表,它有列[col1、col2、col3....col9]。我想在Python中把所有列数据合并到一个列中作为col?

  • 问题内容: 我有以下SQL问题: 如何使用SELECT命令将一列(内部文本)划分为两个单独的带有拆分文本的列? 我需要使用空格字符分隔文本数据。我知道最好举一个例子来简化它。所以: 输出: 所需的输出: 谢谢大家的帮助。 问题答案: 取决于数据的一致性-假设要在第一列与第二列中显示的内容之间用一个空格隔开: 您还可以在REGEX中使用以下查询: Oracle 10g +具有正则表达式支持,根据您需