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; 
相關問題