一、基本概念
1、mysql
中「鍵」和「索引」的定義相同,所以外來鍵和主鍵一樣也是索引的一種。不同的是
mysql
會自動為所有表的主鍵進行索引,但是外來鍵字段必須由使用者進行明確的索引。用於外來鍵關係的字段必須在所有的參照表中進行明確地索引,
innodb
不能自動地建立索引。
2、外來鍵可以是一對一的,乙個表的記錄只能與另乙個表的一條記錄連線,或者是一對多的,乙個表的記錄與另乙個表的多條記錄連線。
3、如果需要更好的效能,並且不需要完整性檢查,可以選擇使用
myisam
表型別,如果想要在
mysql
中根據參照完整性來建立表並且希望在此基礎上保持良好的效能,最好選擇表結構為
innodb
型別。
4、外來鍵的使用條件
① 兩個表必須是
innodb
表,myisam
表暫時不支援外來鍵
② 外來鍵列必須建立了索引,
mysql 4.1.2
以後的版本在建立外來鍵時會自動建立索引,但如果在較早的版本則需要顯式建立;
③ 外來鍵關係的兩個表的列必須是資料型別相似,也就是可以相互轉換型別的列,比如
int和
tinyint
可以,而
int和
char
則不可以;
5、外來鍵的好處:可以使得兩張表關聯,保證資料的一致性和實現一些級聯操作。
二、使用方法
1、建立外來鍵的語法:
外來鍵的定義語法:
[constraint symbol] foreign key [id] (index_col_name, ...)
references tbl_name (index_col_name, ...)
[on delete ]
[on update ]
該語法可以在
create table
和 alter table
時使用,如果不指定
constraint symbol
,mysql
會自動生成乙個名字。
on delete、
on update
表示事件觸發限制,可設引數:
① restrict(限制外表中的外來鍵改動,預設值)
② cascade(跟隨外來鍵改動)
③ set null(設空值)
④ set default(設預設值)
⑤ no action(無動作,預設的)
2、示例
1)建立表1
create table repo_table(
repo_id char(13) not null primary key,
repo_name char(14) not null)
type=innodb;
建立表2
mysql> create table busi_table(
-> busi_id char(13) not null primary key,
-> busi_name char(13) not null,
-> repo_id char(13) not null,
-> foreign key(repo_id) references repo_table(repo_id))
-> type=innodb;
2)插入資料
insert into repo_table values("12","sz"); //success
insert into repo_table values("13","cd"); //success
insert into busi_table values("1003","cd", "13"); //success
insert into busi_table values("1002","sz", "12"); //success
error 1452 (23000): cannot add or update a child row: a foreign key constraint fails (`smb_man`.`busi_table`, constraint `busi_table_ibfk_1` foreign key (`repo_id`) references `repo_table` (`repo_id`))
3)增加級聯操作
mysql> alter table busi_table
-> add constraint id_check
-> foreign key(repo_id)
-> references repo_table(repo_id)
-> on delete cascade
-> on update cascade;
-----
engine=innodb default charset=gb2312; //另一種方法,可以替換type=innodb;
3、相關操作
外來鍵約束(表
2)對父表(表
1)的含義:
在父表上進行
update/delete
以更新或刪除在子表中有一條或多條對應匹配行的候選鍵時,父表的行為取決於:在定義子表的外來鍵時指定的
on update/on delete
子句。
關鍵字 含義
cascade
刪除包含與已刪除鍵值有參照關係的所有記錄
set null
修改包含與已刪除鍵值有參照關係的所有記錄,使用
null
值替換(
只能用於已標記為
not null
的字段)
restrict
拒絕刪除要求,直到使用刪除鍵值的輔助表被手工刪除,並且沒有參照時
(這是預設設定,也是最安全的設定)
no action
啥也不做
4、其他
在外鍵上建立索引:
index repo_id (repo_id),
foreign key(repo_id) references repo_table(repo_id))
參考【1】
w3school
關於mysql
的專題講解
】 mysql c api programming tutorial
】 對外鍵的使用示例,很不錯
】 mysql
官網英文**
中文**
】 對外鍵講解的比較全面,可以一讀
mysql 外來鍵 del 記錄 MySQL 外來鍵
在mysql中 1 mysql 資料表主要支援六種型別 分別是 bdb heap isam merge myisam innobdb。這六種又分為兩類,一類是 事務安全型 transaction safe 包括bdb和innodb 其餘都屬於第二類,稱為 非事務安全型 non transaction...
mysql外來鍵和外來鍵約束
1.mysql中 鍵 和 索引 的定義相同,所以外來鍵和主鍵一樣也是索引的一種。不同的是mysql會自動為所有表的主鍵進行索引,但是外來鍵字段必須由使用者進行明確的索引。用於外來鍵關係的字段必須在所有的參照表中進行明確地索引 2.如果表a的主關鍵字是表b中的字段,則該字段稱為表b的外來鍵,表a稱為主...
mysql 外來鍵和外來鍵約束
1.外來鍵 如果公共關鍵字在乙個關係中是主關鍵字,那麼這個公共關鍵字被稱為另乙個關係的外來鍵。就是a表的主鍵,被用到了b表中,此時它就成了外來鍵 2.外來鍵約束 如果想要插入或者更新外來鍵的值,資料庫會和引用表中字段的資料進行驗證,如果插入或更改的值不在被引用的表中,則插入失敗 外來鍵的作用就是保證...