12-MySQL索引和外鍵

索引

  • 什么是索引?
    索引用于快速找出在某個列中有一特定值的行,不使用索引蕊肥,MySQL必須從第一條記錄開始讀完整個表休吠,直到找出相關(guān)的行扳埂,表越大,查詢數(shù)據(jù)所花費的時間就越多瘤礁,如果表中查詢的列有一個索引阳懂,MySQL能夠快速到達一個位置去搜索數(shù)據(jù)文件,而不必查看所有數(shù)據(jù),那么將會節(jié)省很大一部分時間希太。
  • MySQL中索引的優(yōu)缺點和使用原則
    • 優(yōu)點
      • 所有的MySql字段都可以用作索引
      • 大大加快數(shù)據(jù)的查詢速度
    • 原則
      • 對經(jīng)常用于查詢的字段應(yīng)該創(chuàng)建索引克饶,
      • 數(shù)據(jù)量小的表最好不要使用索引,索引就可能不會產(chǎn)生優(yōu)化效果誊辉。
  • 索引分類
    • 普通索引:  MySQL中基本索引類型矾湃,沒有什么限制,允許在定義索引的列中插入重復(fù)值和空值堕澄,純粹為了查詢數(shù)據(jù)更快一點邀跃。
    • 唯一索引(唯一鍵): 索引列中的值必須是唯一的,但是允許為空值蛙紫,
    • 主鍵索引:是一種特殊的唯一索引拍屑,不允許有空值。
    • 具體可以參考文檔
示例一:
create table test1(
    id int,
    name varchar(20),
    index idx_name(name) #創(chuàng)建索引
);

create table test2(
    id int,
    name varchar(20),
);
create index idx_name on test2(name); #創(chuàng)建索引

create table test3(
    id int,
    name varchar(20),
);
alter table test3 add index idx_name(name);

示例二:
create table test4(
    id int,
    name varchar(20),
    unique index idx_name(name) #創(chuàng)建索引
);

create table test5(
    id int,
    name varchar(20),
);
create unique index idx_name on test5(name); #創(chuàng)建索引

create table test6(
    id int,
    name varchar(20),
);
alter table test6 add unique index idx_name(name);


4.刪除索引
drop index idx_name on test6

數(shù)據(jù)完整性

  • 實體完整性(行的完整性)
    一行數(shù)據(jù)是否完整, 如果多條數(shù)據(jù)相同, 無法區(qū)分, 我們稱之為實體不完整
name score
lnj  100
lnj  100

解決方案:
- 添加主鍵約束
id name score
1  lnj  100
2  lnj  100

- 添加唯一鍵約束
name score
lnj  100
zq  100

- 自動增長列
id name score
1  lnj  100
2  lnj  100
  • 域完整性(列完整性)
    某一列數(shù)據(jù)是否完整, 如果出現(xiàn)null, 不匹配的數(shù)據(jù) 都表示不完整
id name score
1   lnj  100
2   zq   null
2   zq   tyt

- 數(shù)據(jù)類型約束
id name score
1   lnj  100
2   zq   null
2   zq   0

解決方案:

- 非空約束
id name score
1   lnj  100
2   zq   0
2   zq   0

- 默認值約束
id name score
1   lnj  100
2   zq   59.5
2   zq   0
  • 引用完整性
    默認情況下多張表之間是沒有任何關(guān)系的, 所以給A表可以隨意插入數(shù)據(jù), 給B表也可以隨意插入數(shù)據(jù)
    例如有一張學(xué)生表和一張成績表, 要求成績表中保存的必須是學(xué)生表中每個學(xué)生的成績
    +  學(xué)生表
      +    id      name
      +     1       lnj
      +     2       zq
    
      + 成績表
      +     id      stuid     score
      +     1         1         100
      +     2         3         99
      +     3         2         86
    
    • 可以通過外鍵約束添加表與表之間的關(guān)系,告訴MySQL在插入數(shù)據(jù)的時候, 檢查是否存在依賴的數(shù)據(jù), 存在才可以插入.

外鍵

  • 什么是外鍵?
    如果一張表中有一個字段引用了另一張表中的主鍵, 那么這個字段我們就稱之為外鍵
例如: 成績表中的stuid引用了學(xué)生表中的id, 那么stuid我們就稱之為外鍵
注意點:  成績表中的stuid引用了學(xué)生表中的id, 那么成績表我們稱之為"從表", 學(xué)生表稱之為主表
示例二:
create table stugrade2(
    id int auto_increment primary key,
    stuid int,
    score float,
    #告訴MySQL將stuid作為外鍵, 值是引用stuinfo中的id
    foreign key(stuid) references stuinfo(id)
);
insert into stugrade2 values(null, 3, 100); #報錯, 因為sutinfo中沒有id為3的人
insert into stuinfo values(null, 'lnj');
insert into stugrade2 values(null, 3, 100); #報錯, 因為sutinfo中沒有id為3的人
insert into stugrade2 values(null, 1, 100);
delete from stuinfo where id=1; #報錯, 因為有其它表引用這這條數(shù)據(jù)
  • 外鍵的特點
    • 主表中沒有對應(yīng)的數(shù)據(jù), 從表不能插入, 因為插入之后數(shù)據(jù)也不完整
    • 從表引用這主表的數(shù)據(jù), 主表不能刪除該數(shù)據(jù), 因為刪除之后數(shù)據(jù)也不完整
  • 查看外鍵
    show create table stugrade3\G;
  • 刪除外鍵
    alter table stugrade3 drop foreign key stugrade3_ibfk_1;
  • 外鍵相關(guān)的操作
- 嚴格模式(默認)
    + 主表不存在對應(yīng)的數(shù)據(jù), 從表不允許插入
    + 從表引用著主表的數(shù)據(jù), 主表不能刪除
    + 從表引用著主表的數(shù)據(jù), 主表不能修改
- 置空操作
    + 如果主表中的數(shù)據(jù)被刪除了, 從表中對應(yīng)的字段變?yōu)閚ull, 我們就稱之為置空操作
    + 流入: 主表中id為1的人被刪除了, 那么從表中的stuid變?yōu)閚ull
- 級聯(lián)操作
    + 如果主表發(fā)生了變化, 從表也跟著變化, 我們就稱之為級聯(lián)操作
    + 例如: 主表中'lnj'的id從1變?yōu)?, 那么從表中的stuid也從1變?yōu)?

- 格式:
     foreign key(字段) references 主表名(主表主鍵)[主表刪除的動作][主表更新的動作]

示例一:
create table stugrade(
    id int auto_increment primary key,
    stuid int,
    score float,
    #注意點: 一般在企業(yè)開發(fā)中都是刪除就清空, 更新就隨著更新
    foreign key(stuid) references stuinfo(id) on delete set null on update cascade
);
insert into stugrade values(null, 1, 100);
update stuinfo set id=666 where id=1;
delete from stuinfo where id=666;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坑傅,一起剝皮案震驚了整個濱河市僵驰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌唁毒,老刑警劉巖蒜茴,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異浆西,居然都是意外死亡粉私,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進店門近零,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诺核,“玉大人,你說我怎么就攤上這事久信〗焉保” “怎么了?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵裙士,是天一觀的道長入客。 經(jīng)常有香客問我,道長潮售,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任锅风,我火速辦了婚禮酥诽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘皱埠。我一直安慰自己肮帐,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著训枢,像睡著了一般托修。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恒界,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天睦刃,我揣著相機與錄音,去河邊找鬼十酣。 笑死涩拙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耸采。 我是一名探鬼主播兴泥,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼虾宇!你這毒婦竟也來了搓彻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤嘱朽,失蹤者是張志新(化名)和其女友劉穎旭贬,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體燥翅,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡骑篙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了森书。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片靶端。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凛膏,靈堂內(nèi)的尸體忽然破棺而出杨名,到底是詐尸還是另有隱情,我是刑警寧澤猖毫,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布台谍,位于F島的核電站,受9級特大地震影響吁断,放射性物質(zhì)發(fā)生泄漏趁蕊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一仔役、第九天 我趴在偏房一處隱蔽的房頂上張望掷伙。 院中可真熱鬧,春花似錦又兵、人聲如沸任柜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宙地。三九已至摔认,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宅粥,已是汗流浹背参袱。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粹胯,地道東北人蓖柔。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像风纠,于是被迫代替她去往敵國和親况鸣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,499評論 2 348

推薦閱讀更多精彩內(nèi)容