mysql - 外键约束不当

标签 mysql database foreign-keys

我有一个保存学生记录的数据库,但在以下情况下失败: 1. 如果某个“类(class)”不存在“类(class)”,则该“类(class)”和“类(class)”的组合中不应存在任何学生。 例如,假设“第二”类只有两个“A”和“B”部分,那么“第二”类的所有学生都必须属于“A”或“B”部分,或者我们可以说他们可以不存在属于“二”类“C”组的学生。

我的数据库结构: StudentInfo表保存了学生的数据,其中有学生姓名、学生类(class)、学生部门列。 ClassnSec是一个维护Class和Section关系的表。

我将“学生类(class)”设置为 F.K,它指向“类(class)”,“学生部门”指向“部门”。

例如 ClassnSec 的条目

-------------------------------------
ClassID    |   SectionID

  1                A
  1                B
  2                A
-------------------------------------

输入学生信息

-------------------------------------
Name   |  ClassID   |  Section ID
Mark        1           A
Joe         2           A
Gaurav      1           B
-------------------------------------

现在尝试在下面插入,它不应该被插入,因为没有“2”和“B”的行/条目,即不存在第2类的任何B部分。因此插入学生数据一定是非法的。

-------------------------------------
Jon        2           B
-------------------------------------

最佳答案

据我所知,MySQL 支持多列约束:

CREATE TABLE ClassNSec (
  ClassID int not null,
  SectionID int not null,
  constraint PK_ClassNSec PRIMARY KEY (ClassID,SectionID)
);
CREATE TABLE StudentInfo (
  StudentData varchar(10) not null,
  ClassID int not null,
  SectionID int not null,
  constraint FK_StudentInfo_ClassNSec FOREIGN KEY (ClassID,SectionID)
    references ClassNSec (ClassID,SectionID)
);

这可以防止类和部分的任何不匹配。您可能(现在)想要考虑是否想要/需要单独的类和部分外键约束。

关于mysql - 外键约束不当,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17398831/

相关文章:

mysql - Hibernate HQL - 从今天开始获取下一个日期的实体

php - 如何从多个表中获取按时间排序的最后 30 个项目?

database - 查看权限通常如何在关系数据库中实现?

mysql - 使用复合键时 rails 出现问题

c# - MySQL Connector .NET EF6 运算符 LIKE 不工作

php - 如何从下拉列表中检索值到 Yii 的 Controller 中?

java - 如何在Java中存储树结构?

mysql - 在MySQL中极快地查询排名数?

mysql - 如何修复 MySQL 中的外键错误?

ruby-on-rails - 建模 ActiveRecord 对象与 Redis 之间的关联 : avoiding multiple queries