【发布时间】:2016-02-17 13:04:24
【问题描述】:
常规:给定多个列的外键,其中一些可能为 NULL。
默认情况下 (MATCH SIMPLE) MySQL/MariaDB InnoDB 只要多列外键的至少一列为 NULL,就不会检查外键。
要求:如果从父项中删除一行,则相应子项的一列应设置为 NULL,但不能将外键中的两列都设置为 NULL。
示例/说明:可能会列出一个学生参加讲座,也可以选择参加其中一个讲座组。如果讲座被删除,则应删除所有学生列表(作品)及其所有组(作品)。如果只删除了一个组,则仍应将学生列为讲座,但不应再将他们分配到组(问题)。
示例/SQL:以下 SQL 说明了此示例,但最后一条语句将不起作用,因为最后一个 FOREIGN KEY 要求 LectureId 和 groupId 都可以为 NULL,但是使两者都可以为 NULL 意味着删除组也会将 LectureId 设置为 NULL。
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
);
【问题讨论】:
标签: mysql sql foreign-keys innodb mariadb