關於mysql設置外鍵,實現參照性完整性約束,以及workbench上的一個bug(?)


一、本次數據庫中有student,course,sc表,其設置情況

 1 -- 創建course表
 2 CREATE TABLE `course` (
 3   `cno` varchar(3) NOT NULL,
 4   `cname` varchar(12) DEFAULT NULL,
 5   `lhour` int(11) DEFAULT NULL,
 6   `credit` int(11) DEFAULT NULL,
 7   `semester` varchar(2) DEFAULT NULL,
 8   PRIMARY KEY (`cno`)
 9 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
10 
11 -- 創建student表
12 CREATE TABLE `student` (
13   `sno` varchar(6) NOT NULL,
14   `sname` varchar(6) DEFAULT NULL,
15   `sex` varchar(2) DEFAULT NULL,
16   `bdate` datetime DEFAULT NULL,
17   `dept` varchar(8) DEFAULT NULL,
18   `classno` varchar(4) DEFAULT NULL,
19   PRIMARY KEY (`sno`)
20 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
21 
22 -- 創建sc表
23 CREATE TABLE `sc` (
24   `sno` varchar(6) NOT NULL,
25   `cno` varchar(3) NOT NULL,
26   `grade` int(11) DEFAULT NULL,
27   PRIMARY KEY (`sno`,`cno`),
28 -- 這里直接插入外鍵
29   foreign  KEY (`sno`) references `student`.`student`(`sno`),
30   foreign  KEY (`cno`) references `student`.`course`(`cno`)
31 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

這是創建表時直接插入外鍵,也可以創建表后再對sc表插入外鍵

1 -- 建表之后再對表中添加外鍵
2 alter table `sc`
3 add foreign key (`sno`)
4 references `student`(`sno`);
5 
6 alter table `sc`
7 add foreign key (`cno`)
8 references `course`(`cno`);

二、驗證其參照完整性。這個時候,我們再對sc表添加student表里沒有的sno,course表沒有的cno,都不被允許。刪除student表或course表中sc中出現過的sno(cno)的行和列時,也不被允許。

例,刪除student表

 

三、workbench的bug(?)

在workbench進行刪除操作的時候,即使設置了外鍵,也是可以刪除表的

這個時候再加載數據就會有問題,在左上方點刷新數據庫按鈕的時候,就會出現數據加載有問題錯誤

實際上設置外鍵時就不能只刪除主表了,這不符合參照完整性約束,會出bug,workbench編譯就沒有考慮到這個;

並且這不是我的mysql版本的問題,我的是8.0版本,使用命令行就沒有問題,顯示不能刪除。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM