0

假设师生常见的情况有两个限制:如何在一对多关系中实现零或一的多重性?

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

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

+0

一个老师是学生? – xQbert

+0

没有他/她不能 – Hans

+1

谁是零教师的学生? –

回答

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; 
相关问题