孔子曰:"學而實習之", 要想把知識變成自己的東西,必須得自己實際操作,閒話少說,本文以補習班表(sc_class) 學生表(sc_student)來進行舉例。
再說一遍:自己從頭動手做一遍!!!!!!!!
1.新建乙個資料庫。
mysql>create database school;
2.新建乙個班級表 班級名稱(name),
mysql>create table sc_class(id smallint primary key,
name varchr(30),
mysql>insert into sc_class(name) values('chinese'),('math'),('english');
3.新建乙個學生表 名字(name) 學號(number)class_id 對應的班級 連線到補習班級表(外鏈)id。
mysql>create table student( id smallint auto_increment primary key, name varchar(20) not null, number int(20) not null,class_id int, foreign key(class_id) references sc_class(id));
* 這裡學生表中的class_id 就是外來鍵 連線到 補習班表中
1.什麼是外來鍵? 有什麼作用?
外來鍵的定義:表的外來鍵是另一張表的主鍵。將兩張表聯絡到一起。
作用:簡單的說是為了保證資料的完整性。
2.外來鍵的要求?
父表(student)與子表(sc_class)必須具有相同的儲存引擎,而且禁用使用臨時表
資料表的儲存引擎必須為innodb
外來鍵列與參照列必須具有相似的資料型別,其中數字的長度或有無符號位必須相同,而字元的長度可以不同。
外來鍵列和參照列必須建立索引,如果外來鍵列不存在索引,mysql會自動建立索引。
在使用外來鍵的過程中,還需要了解到什麼是外來鍵約束,顧名思義,就是使用外來鍵的一系列規則,目的是為了保證資料的完整性和一致性,只是這個規則需要自己去定義。
那麼怎麼操作和定義這個規則呢?先來記住這幾個關鍵字:
cascade:從父表刪除或更新會自動刪除或更新子表中匹配的行
set null:從父表刪除或更新行,會設定子表中的外來鍵列為null,但必須保證子表列沒有指定not null
restrict:拒絕對父表的刪除或更新操作(如果子表中有匹配的記錄,則不允許對父表對應候選鍵進行update/delete操作,這個是ansi sql-92標準,從mysql4.0.8開始支援)
no action:標準sql的關鍵字,在mysql中與restrict相同
* 子表指的是外來鍵所在的表,這裡是student。父表是外來鍵所連線的表這裡是sc_class.
測試一下沒有約束前刪出父表的內容會怎麼樣:
mysql> select * from student;
+----+------+--------+----------+
| id | name | number | class_id |
+----+------+--------+----------+
| 1 | jack | 1001 | 1 |
| 2 | jack | 1002 | 2 |
| 3 | alex | 1003 | 2 |
+----+------+--------+----------+
3 rows in set (0.00 sec)
mysql> select * from sc_class;
+----+---------+
| id | name |
+----+---------+
| 1 | english |
| 2 | chinese |
| 3 | math |
+----+---------+
3 rows in set (0.00 sec)
1.這裡可以看到沒有設定約束條件時是刪除不了的。
mysql> delete from sc_class where id=1;
error 1451 (23000): cannot delete or update a parent row: a foreign key constraint fails (`school`.`student`, constraint `student_ibfk_1` foreign key (`class_id`) references `sc_class` (`id`))
2.修改約素為cascade。
mysql> alter table student drop foreign key student_ibfk_1;
query ok, 0 rows affected (0.01 sec)
records: 0 duplicates: 0 warnings: 0
mysql> alter table student add constraint `student_ibfk_1` foreign key (`class_id`) references `sc_class` (`id`) on delete cascade;
query ok, 3 rows affected (0.04 sec)
records: 3 duplicates: 0 warnings: 0
3.再檢視現在表是否有變化?
mysql> delete from sc_class where id=1;
query ok, 1 row affected (0.00 sec)
mysql> select * from sc_class;
+----+---------+
| id | name |
+----+---------+
| 2 | chinese |
| 3 | math |
+----+---------+
2 rows in set (0.00 sec)
mysql> select * from student;
+----+------+--------+----------+
| id | name | number | class_id |
+----+------+--------+----------+
| 2 | jack | 1002 | 2 |
| 3 | alex | 1003 | 2 |
+----+------+--------+----------+
2 rows in set (0.00 sec)
這裡就可以看到不僅父表被刪除了 連子表匹配的項也被刪除了。
mysql之外鍵
乙個是讓資料庫自己通過外來鍵來保證資料的完整性和一致性 乙個就是能夠增加er圖的可讀性 有些人認為外來鍵的建立會給開發時運算元據庫帶來很大的麻煩.因為資料庫有時候會由於沒有通過外來鍵的檢測而使得開發人員刪除,插入操作失敗.他們覺得這樣很麻煩 其實這正式外來鍵在強制你保證資料的完整性和一致性.這是好事...
MySQL之外鍵約束
mysql有兩種常用的引擎型別 myisam和innodb。目前只有innodb引擎型別支援外來鍵約束。innodb中外鍵約束定義的語法如下 constraint symbol foreign key index name index col name,referencestbl name inde...
MySQL之外鍵約束
mysql有兩種常用的引擎型別 myisam和innodb。目前只有innodb引擎型別支援外來鍵約束。innodb中外鍵約束定義的語法如下 constraint symbol foreign key index name index col name,references tbl name ind...