1、什麼時候需要用到外來鍵索引呢?
答:a表中存在唯一索引id_a,b表中的字段包含id_a,由於b表自身已經有主鍵索引,此時如果將字段id_a設定為外來鍵索引索引(foreign key),則建立外來鍵索引。
使用場景:
(1)父表更新時,子表也更新;父表刪除時,如果
(2)子表有匹配的項,則刪除失敗。
(3)父表更新時,子表也更新;父表刪除時子表匹配的項也刪除。
即:使用外來鍵可以使得修改或者刪除的級聯操作的日常維護工作更加輕鬆。
2、建立語法
[constraint [symbol]] foreign key [index_name] (index_col_name, ...) references tbl_name(index_col_name,...) [on delete reference_option] [on update reference_option]
reference_option:
restrict | cascade | set null | no action
(外鍵值最直接的作用)如果子表試圖建立乙個父表不存在的外鍵值,innodb會拒絕任何insert或者update操作。
如果父表試圖update或者delete任何子表中存在或匹配的外鍵值,最終動作取決於外來鍵約束定義中的on update和on delete選項。
innodb支援以下幾種動作型別,如果沒有指定on delete或者on update,預設的動作為retrict:
(1)cascade:顧名思義:級聯,從父表中刪除或者更新對應的行,同時自動的刪除或者更新子表中匹配的行。如:on delete canscade和on update canscade。(最有用)
(2)set null:從父表中刪除或更新對應的行,同時將子表中的外來鍵列設定為空。注意,這些在外鍵列沒有被設為not null時才生效。如:on delete set null和on update set null。
(3)no action:
(4)restrict:拒絕刪除或者更新父表。(預設)
舉個栗子:
建立表province:
create table `province` (
`id` smallint(6) not null auto_increment,
`name` varchar(10) collate utf8_bin not null,
primary key (`id`)
)engine=innodb auto_increment=4 default charset=utf8 collate=utf8_bin ;
建立表student:
create table `student` (
`id` smallint(6) not null auto_increment,
`name` varchar(10) collate utf8_bin not null,
`pid` smallint(6) default null,
primary key (`id`),
key `pik_fk` (`pid`),
constraint `pik_fk` foreign key (`pid`) references `province` (`id`) on delete cascade on update cascade
)engine=innodb auto_increment=7 default charset=utf8 collate=utf8_bin;
上述student表中已經建立了外來鍵級聯索引(包括delete cascade 和 update cascade)
這裡,先介紹下如何刪除外來鍵索引:可以看到建立外來鍵索引產生了兩個屬性乙個是字段pid被設定為索引,而且還加了乙個約束屬性。
刪除的操作:
(1)dorp table student drop foreign key pik_fk;
(2)drop table student drop key pik_fk;
注意:需要分別執行兩次pik_fk的操作。
執行上述操作之後,表結構如下:
create table `student` (
`id` smallint(6) not null auto_increment,
`name` varchar(10) collate utf8_bin not null,
`pid` smallint(6) default null,
primary key (`id`)
)engine=innodb auto_increment=7 default charset=utf8 collate=utf8_bin;
需求一:現在需要增加乙個外來鍵索引,當該外來鍵對應的父表刪除掉主鍵id,則對於的該表中關聯的字段也要一起刪除掉。增加如下:
alter table student add constraint pid_fk foreign key (pid) references province (id) on delete cascade on update cascade;
則新增外來鍵索引:
create table `student` (
`id` smallint(6) not null auto_increment,
`name` varchar(10) collate utf8_bin not null,
`pid` smallint(6) default null,
primary key (`id`),
key `pid_fk` (`pid`),
constraint `pid_fk` foreign key (`pid`) references `province` (`id`) on delete cascade on update cascade
)engine=innodb auto_increment=7 default charset=utf8 collate=utf8_bin;
此時,如果執行刪除province中某條記錄,則會刪除student中所有有關聯該條記錄主鍵的記錄。如果更新province中主鍵id,則會更新所有student中原有表對應的外來鍵id。
需求二:如果刪除各province中的主鍵id,則student中中外鍵pid將相應更改為null。
alter table student add constraint pid_fk foreign key (pid) references province (id) on delete set null on update set null;
需求三:如果province中的主鍵id在student中外鍵pid中存在,則不允許進行刪除和更改操作。
alter table student add constraint pid_fk foreign key (pid) references province (id) on delete restrict on update restrict;
外來鍵索引的缺點:
由於加了約束,因此操作變慢了。
mysql關於外來鍵設定
今天在設計酒店管理系統時走了很多彎路 1.mysql使用的預設資料庫引擎myisam並不能很好支援外來鍵,事務等操作,外來鍵總是設定不上,需要將引擎改為innodb,這個是最完善支援各種sql操作的。engine innodb 2.在最初設計資料庫是就應當把所有關係想好,確認關係正確再去生成資料庫,...
MySql學習筆記 索引,外來鍵
索引由資料庫表中一列或多列組合而成,其作用是提高對錶中資料的查詢速度。索引是建立在表上的,是對資料庫表中一列或多列的值進行排序的一種結構。索引可以提高查詢的速度。通過索引,查詢資料時可以不必讀完記錄的所有資訊,而只是查詢索引列。否則,資料庫系統將讀取每條記錄的所有資訊進行匹配。例如,索引相當於新華字...
Mysql中的外來鍵索引
mysql create table tab1 id int,name char 20 query ok,0 rows affected 0.21 sec mysql alter table tab1 add primary key id query ok,0 rows affected 0.39 ...