MySQL外鍵 - ForeignKey

MySQL外鍵的使用

一個表定義了一個主鍵,那麼該表能夠經過該鍵惟一地表示表中的每個記錄。html

外鍵是相對與表中的一個列給它的一個約束,通常是另外一個表的主鍵,該列的值必須在另外一個表中出現。性能

因而可知,外鍵表示了兩個關係之間的聯繫。以另外一個關係的外鍵做爲主關鍵字的表稱爲主表,具備此外鍵的表稱爲主表的從表。外鍵又稱做外關鍵字。spa

基本概念

MySQL中"鍵"和"索引"的定義相同,所依外鍵和主鍵同樣也是索引的一種。不一樣的是MySQL會自動爲全部表的主鍵進行索引,可是外鍵字段必須由用戶進行明確的索引。用於外鍵關係的字段必須在全部參照表中進行明確地索引,InnoDB不能自動建立索引。code

● 外鍵能夠是一對一的,一個表的記錄只能與另外一個表的一條記錄鏈接,或者是一對多的,一個表的記錄與另外一個表的多條記錄鏈接。htm

● 若是須要更好的性能,而且不須要完整性檢查,能夠選擇使用MyISAM表類型,若是想要在MySQL中根據參照完整性來創建表而且但願在此基礎上保持良好的性能,最好選擇表結構爲innoDB類型。blog

● 外鍵的使用條件:索引

  • 兩個表必須是InnoDB表,MyISAM表暫時不支持外鍵
  • 外鍵列必須創建了索引,MySQL 4.1.2之後的版本在創建外鍵時會自動建立索引,但若是在較早的版本則須要顯式創建;
  • 外鍵關係的兩個表的列必須是數據類型類似,也就是能夠相互轉換類型的列,好比int和tinyint能夠,而int和char則不能夠;

● 外鍵的好處:事件

  • 可使得兩張表關聯,保證數據的一致性和實現一些級聯操做。
  • 保持數據一致性,完整性,主要目的是控制存儲在外鍵表中的數據。
  • 使兩張表造成關聯,外鍵只能引用外表中的列的值!可使得兩張表關聯,保證數據的一致性和實現一些級聯操做;

使用方法:

建立外鍵的語法: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;

相關操做

  • 外鍵約束(表2)對父表(表1)的含義:
  • 在父表上進行update/delete以更新或刪除在子表中有一條或多條對應匹配行的候選鍵時,父表的行爲取決於:在定義子表的外鍵時指定的on update/on delete子句。

其餘

  • 在外鍵上創建索引:
  • index repo_id (repo_id),
  • foreign key(repo_id) references repo_table(repo_id))

外鍵約束使用最多的兩種狀況

-- 父表更新時子表也更新,父表刪除時若是子表有匹配的項,刪除失敗; 在外鍵定義中,使用 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;
相關文章
相關標籤/搜索