mysql外鍵實戰(zhàn)

一退渗、基本概念

1、MySQL中“鍵”和“索引”的定義相同蕴纳,所以外鍵和主鍵一樣也是索引的一種会油。不同的是MySQL會自動為所有表的主鍵進行索引,但是外鍵字段必須由用戶進行明確的索引古毛。用于外鍵關系的字段必須在所有的參照表中進行明確地索引翻翩,InnoDB不能自動地創(chuàng)建索引。

2、外鍵可以是一對一的嫂冻,一個表的記錄只能與另一個表的一條記錄連接胶征,或者是一對多的,一個表的記錄與另一個表的多條記錄連接絮吵。

3弧烤、如果需要更好的性能,并且不需要完整性檢查蹬敲,可以選擇使用MyISAM表類型暇昂,如果想要在MySQL中根據(jù)參照完整性來建立表并且希望在此基礎上保持良好的性能,最好選擇表結構為innoDB類型伴嗡。

4急波、外鍵的使用條件

① 兩個表必須是InnoDB表,MyISAM表暫時不支持外鍵

② 外鍵列必須建立了索引瘪校,MySQL 4.1.2以后的版本在建立外鍵時會自動創(chuàng)建索引澄暮,但如果在較早的版本則需要顯式建立;

③ 外鍵關系的兩個表的列必須是數(shù)據(jù)類型相似阱扬,也就是可以相互轉換類型的列泣懊,比如int和tinyint可以,而int和char則不可以麻惶;

5馍刮、外鍵的好處:可以使得兩張表關聯(lián),保證數(shù)據(jù)的一致性和實現(xiàn)一些級聯(lián)操作窃蹋。

二卡啰、使用方法

1、創(chuàng)建外鍵的語法:

外鍵的定義語法:

[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表示事件觸發(fā)限制亡脸,可設參數(shù):

① RESTRICT(限制外表中的外鍵改動,默認值)

② CASCADE(跟隨外鍵改動)

③ SET NULL(設空值)

④ SET DEFAULT(設默認值)

⑤ NO ACTION(無動作树酪,默認的)

2浅碾、示例

1)創(chuàng)建表1

create table repo_table(

repo_id char(13) not null primary key,

repo_name char(14) not null)

type=innodb;

創(chuàng)建表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)插入數(shù)據(jù)

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`))

3)增加級聯(lián)操作

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))

技術分享:www.kaige123.com

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末懂版,一起剝皮案震驚了整個濱河市鹃栽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌躯畴,老刑警劉巖民鼓,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蓬抄,居然都是意外死亡丰嘉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門嚷缭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饮亏,“玉大人,你說我怎么就攤上這事阅爽÷沸遥” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵付翁,是天一觀的道長简肴。 經(jīng)常有香客問我,道長胆敞,這世上最難降的妖魔是什么着帽? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮移层,結果婚禮上仍翰,老公的妹妹穿的比我還像新娘。我一直安慰自己观话,他們只是感情好予借,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著频蛔,像睡著了一般灵迫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晦溪,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天瀑粥,我揣著相機與錄音,去河邊找鬼三圆。 笑死狞换,一個胖子當著我的面吹牛避咆,可吹牛的內容都是我干的。 我是一名探鬼主播修噪,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼查库,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了黄琼?” 一聲冷哼從身側響起樊销,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脏款,沒想到半個月后围苫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡撤师,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年够吩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丈氓。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡周循,死狀恐怖,靈堂內的尸體忽然破棺而出万俗,到底是詐尸還是另有隱情湾笛,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布闰歪,位于F島的核電站嚎研,受9級特大地震影響,放射性物質發(fā)生泄漏库倘。R本人自食惡果不足惜临扮,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望教翩。 院中可真熱鬧杆勇,春花似錦、人聲如沸饱亿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽彪笼。三九已至钻注,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間配猫,已是汗流浹背幅恋。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泵肄,地道東北人捆交。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓识埋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親零渐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容