如何在一对多关系中实现多重零或一?

时间:2015-10-05 14:20:01

标签: sql database foreign-keys relational-database database-relations

假设师生常见情况有两个局限:

  • 所有老师都应该至少有一名学生(你教或你被解雇了!)
  • 所有学生应该有零个或一个老师(学生可以自由选择老师!)

困难的部分是如何确保教师至少有一名学生。 是否有可能使用关系数据库实现这一点,并且只通过关系保证多重性,而不使用触发器,计算列和其他花哨的东西? enter image description here

1 个答案:

答案 0 :(得分:1)

您可以通过从教师向学生的教师选择栏声明外键约束来实现它。我不确定所有SQL DBMS是否都支持引用非素数(甚至非唯一)列的外键约束,但只要存在适当的索引,MySQL至少没有问题。但是,要插入教师,您需要暂时禁用外键约束,因为MySQL不支持使用单个查询插入多个表。

以下是一个例子:

CREATE TABLE `teachers` (
  `tea_id` int(11) NOT NULL AUTO_INCREMENT,
  `tea_name` varchar(255) NOT NULL,
  PRIMARY KEY (`tea_id`)
);

CREATE TABLE `students` (
  `stu_id` int(11) NOT NULL AUTO_INCREMENT,
  `stu_name` varchar(255) NOT NULL,
  `tea_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`stu_id`),
  KEY `tea_id` (`tea_id`),
  CONSTRAINT `tea_fk`
  FOREIGN KEY (`tea_id`) REFERENCES `teachers` (`tea_id`)
  ON DELETE SET NULL ON UPDATE CASCADE
);

ALTER TABLE `teachers`
ADD CONSTRAINT `stu_fk`
FOREIGN KEY (`tea_id`) REFERENCES `students` (`tea_id`)
ON DELETE NO ACTION ON UPDATE NO ACTION;

INSERT INTO students (stu_name) VALUES ('John'), ('Jane');

SET FOREIGN_KEY_CHECKS=0;
INSERT INTO teachers (tea_name) VALUES ('Jacob');
UPDATE students s JOIN teachers t
SET s.tea_id = t.tea_id
WHERE s.stu_name = 'John' AND t.tea_name = 'Jacob';
SET FOREIGN_KEY_CHECKS=1;