外鍵添加方式一:在創建表的時候,增加約束(麻煩,複雜)
學生表的 gradeid 字段要去引用年級表的 gradeid
定義外鍵key
給這個外鍵添加約束 (執行引用)
1.執行下面語句,生成grade表
CREATE TABLE `grade`(
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年級id',
`gradename` VARCHAR(50) NOT NULL COMMENT '年級名稱',
PRIMARY KEY (`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8 ;
2.刪除之前測試的student表:新建一個新的,插入年級信息
-- 學生表的 gradeid 字段要去引用年級表的 gradeid
-- 定義外鍵key
-- 給這個外鍵添加約束 (執行引用)
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '學號',
`name` VARCHAR(30)NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20)NOT NULL DEFAULT '123456' COMMENT '密碼',
`sex` VARCHAR(2)NOT NULL DEFAULT '女' COMMENT '性別',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`gradeid` INT(10) NOT NULL COMMENT '學生的年級',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '郵箱',
PRIMARY KEY (`id`),
KEY `FK_gradeid`(`gradeid`) ,
CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8 ;
刪除有外鍵關係的表的時候,必須要刪除引用別人的表(student,從表),再刪除被引用的表(grade,主表)
外鍵添加方式二:alter從表add外鍵
ALTER TABLE 表
ADD CONSTRAINT 約束名 FOREIGN KEY(作爲外鍵的列) REFERENCES 哪個表(哪個字段);
1.執行下面語句,生成grade表
CREATE TABLE `grade`(
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年級id',
`gradename` VARCHAR(50) NOT NULL COMMENT '年級名稱',
PRIMARY KEY (`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8 ;
2.執行引用,生成student表
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '學號',
`name` VARCHAR(30)NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20)NOT NULL DEFAULT '123456' COMMENT '密碼',
`sex` VARCHAR(2)NOT NULL DEFAULT '女' COMMENT '性別',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`gradeid` INT(10) NOT NULL COMMENT '學生的年級',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '郵箱',
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8 ;
3.執行引用,生成外鍵
-- 創建表的時候沒有外鍵關係
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);
外鍵添加方式三:圖形界面化
以上三種外鍵都是物理外鍵,數據庫級別的外鍵,我們不建議使用!(避免數據庫過多(例如不好刪除),造成困擾,瞭解即可)
阿里的Java規範:
【強制】不得使用外鍵與級聯,一切外鍵概念必須在應用層解決
答:每次做DELETE或者UPDATE都必須考慮外鍵約束,會導致開發的時候很痛苦,測試數據極爲不方便。
最佳實現:
- 數據庫就是單純的表,只用來存數據,只有行(數據)和列(字段)
- 我們想使用多張表的數據,想使用外鍵(程序去實現)