一個表定義了一個主鍵,那麼該表能夠經過該鍵惟一地表示表中的每個記錄。html
外鍵是相對與表中的一個列給它的一個約束,通常是另外一個表的主鍵,該列的值必須在另外一個表中出現。性能
因而可知,外鍵表示了兩個關係之間的聯繫。以另外一個關係的外鍵做爲主關鍵字的表稱爲主表,具備此外鍵的表稱爲主表的從表。外鍵又稱做外關鍵字。spa
● MySQL中"鍵"和"索引"的定義相同,所依外鍵和主鍵同樣也是索引的一種。不一樣的是MySQL會自動爲全部表的主鍵進行索引,可是外鍵字段必須由用戶進行明確的索引。用於外鍵關係的字段必須在全部參照表中進行明確地索引,InnoDB不能自動建立索引。code
● 外鍵能夠是一對一的,一個表的記錄只能與另外一個表的一條記錄鏈接,或者是一對多的,一個表的記錄與另外一個表的多條記錄鏈接。htm
● 若是須要更好的性能,而且不須要完整性檢查,能夠選擇使用MyISAM表類型,若是想要在MySQL中根據參照完整性來創建表而且但願在此基礎上保持良好的性能,最好選擇表結構爲innoDB類型。blog
● 外鍵的使用條件:索引
● 外鍵的好處:事件
建立外鍵的語法:get
外鍵定義語法:io
[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...) REFERENCES tbl_name (index_col_name, ...) [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}] [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
該語法能夠在 CREATE TABLE 和 ALTER TABLE 時使用,若是不指定CONSTRAINT symbol,MYSQL會自動生成一個名字。
ON DELETE、ON UPDATE表示事件觸發限制,可設參數:
① RESTRICT(限制外表中的外鍵改動,默認值) ② CASCADE(跟隨外鍵改動) ③ SET NULL(設空值) ④ SET DEFAULT(設默認值) ⑤ NO ACTION(無動做,默認的)
示例:
-- 建立表1 create table repo_table(repo_id char(13) not null primary key,repo_name char(14) not null) type=innodb; -- 建立表2 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; -- 插入數據 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
insert into busi_table values("1001","gx", "11"); -- failed,提示; 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`)) -- 增長級聯操做 alter table busi_table add constraint id_check foreign key(repo_id) references repo_table(repo_id) on delete cascade on update cascade;
相關操做
其餘
外鍵約束使用最多的兩種狀況:
-- 父表更新時子表也更新,父表刪除時若是子表有匹配的項,刪除失敗; 在外鍵定義中,使用 ON UPDATE CASCADE ON DELETE RESTRICT;
-- 父表更新時子表也更新,父表刪除時子表匹配的項也刪除。 在外鍵定義中,使用 ON UPDATE CASCADE ON DELETE CASCADE。
InnoDB容許使用ALTER TABLE在一個已經存在的表上增長一個新的外鍵:
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) REFERENCES tbl_name (index_col_name,...) [ON DELETE reference_option] [ON UPDATE reference_option]
InnoDB也支持使用ALTER TABLE來刪除外鍵:
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;