Posted on 2008-09-08 17:07
魚躍于淵 閱讀(126)
評論(0) 編輯 收藏
轉載:[http://growup.blog.51cto.com/229061/44252]
在Mysql中使用foreign key 并不像oracle,access那么簡單,現把使用過程應注意的問題做以講解:
目標:建立下面的外鍵關系
第一步:建表
首先打開命令行窗口,進入Mysql bin目錄,選擇相應數據庫后,建立T_USER表:
create table t_user (id int(11) NOT NULL auto_increment PRIMARY KEY, name VARCHAR(20),group_id int(10)) type=InnoDB;
|
建立T_PASSPORT表:
create table t_passport (id int(11) NOT NULL auto_increment PRIMARY KEY, serial VARCHAR(20)) type=InnoDB;
|
注意紅體字部分:type=InnoDB,關于InnoDB的說明如下:
InnoDB 是 MySQL 上第一個提供外鍵約束的引擎,除了提供事務處理外,InnoDB 還支持行鎖,提供和 Oracle 一樣的一致性的不加鎖讀取,能增加并發讀的用戶數量并提高性能,不會增加鎖的數量。也就是說如果要采用外鍵約束,表類型必須時InnoDB,mysql默認是MyISAM,這種類型不支持外鍵約束。
第二步:建立外鍵關系:
alter table t_user add foreign key(id) references t_passport (id) on delete cascade on update cascade;
|
此外也可以在建表時直接指定外鍵:(以下代碼未驗證)
create table temp( id int, name char(20), foreign key(id) references outTable(id) on delete cascade on update cascade);
|
注意:如果表結構是myISAM,上面的代碼雖然能能執行,但不起任何作用。References有的文章(特別是網友的筆記中)寫成:Refrences初學者應注意。
第三步,測試
測試1:插入外鍵約束
mysql> insert into t_user values(1,'zhaoyuan');
ERROR 1216: Cannot add or update a child row: a foreign key constraint fails
|
外鍵約束,因為t_passport 中尚未有id為1的字段。
測試2、刪除外鍵約束
mysql> delete from t_passport;
Query OK, 1 row affected (0.06 sec)
mysql> select * from t_user;
Empty set (0.00 sec)
|
說明:把T_user id列設為外鍵,參照外表t_passport 的id列, 當t_passport 的id列改變時,T_user會做相應的改變。
注意:建立外鍵的列應該建立索引,且不能為空,引用以被引用的兩列應該是同一類型。