12-MySQL索引和外鍵

索引

  • 什么是索引?
    索引用于快速找出在某個(gè)列中有一特定值的行,不使用索引,MySQL必須從第一條記錄開(kāi)始讀完整個(gè)表,直到找出相關(guān)的行,表越大,查詢數(shù)據(jù)所花費(fèi)的時(shí)間就越多,如果表中查詢的列有一個(gè)索引,MySQL能夠快速到達(dá)一個(gè)位置去搜索數(shù)據(jù)文件,而不必查看所有數(shù)據(jù),那么將會(huì)節(jié)省很大一部分時(shí)間。
  • MySQL中索引的優(yōu)缺點(diǎn)和使用原則
    • 優(yōu)點(diǎn)
      • 所有的MySql字段都可以用作索引
      • 大大加快數(shù)據(jù)的查詢速度
    • 原則
      • 對(duì)經(jīng)常用于查詢的字段應(yīng)該創(chuàng)建索引,
      • 數(shù)據(jù)量小的表最好不要使用索引,索引就可能不會(huì)產(chǎn)生優(yōu)化效果。
  • 索引分類
    • 普通索引:  MySQL中基本索引類型,沒(méi)有什么限制,允許在定義索引的列中插入重復(fù)值和空值,純粹為了查詢數(shù)據(jù)更快一點(diǎn)。
    • 唯一索引(唯一鍵): 索引列中的值必須是唯一的,但是允許為空值,
    • 主鍵索引:是一種特殊的唯一索引,不允許有空值。
    • 具體可以參考文檔
示例一:
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í)體完整性(行的完整性)
    一行數(shù)據(jù)是否完整, 如果多條數(shù)據(jù)相同, 無(wú)法區(qū)分, 我們稱之為實(shí)體不完整
name score
lnj  100
lnj  100

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

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

- 自動(dòng)增長(zhǎng)列
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

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

外鍵

  • 什么是外鍵?
    如果一張表中有一個(gè)字段引用了另一張表中的主鍵, 那么這個(gè)字段我們就稱之為外鍵
例如: 成績(jī)表中的stuid引用了學(xué)生表中的id, 那么stuid我們就稱之為外鍵
注意點(diǎn):  成績(jī)表中的stuid引用了學(xué)生表中的id, 那么成績(jī)表我們稱之為"從表", 學(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); #報(bào)錯(cuò), 因?yàn)閟utinfo中沒(méi)有id為3的人
insert into stuinfo values(null, 'lnj');
insert into stugrade2 values(null, 3, 100); #報(bào)錯(cuò), 因?yàn)閟utinfo中沒(méi)有id為3的人
insert into stugrade2 values(null, 1, 100);
delete from stuinfo where id=1; #報(bào)錯(cuò), 因?yàn)橛衅渌硪眠@這條數(shù)據(jù)
  • 外鍵的特點(diǎn)
    • 主表中沒(méi)有對(duì)應(yīng)的數(shù)據(jù), 從表不能插入, 因?yàn)椴迦胫髷?shù)據(jù)也不完整
    • 從表引用這主表的數(shù)據(jù), 主表不能刪除該數(shù)據(jù), 因?yàn)閯h除之后數(shù)據(jù)也不完整
  • 查看外鍵
    show create table stugrade3\G;
  • 刪除外鍵
    alter table stugrade3 drop foreign key stugrade3_ibfk_1;
  • 外鍵相關(guān)的操作
- 嚴(yán)格模式(默認(rèn))
    + 主表不存在對(duì)應(yīng)的數(shù)據(jù), 從表不允許插入
    + 從表引用著主表的數(shù)據(jù), 主表不能刪除
    + 從表引用著主表的數(shù)據(jù), 主表不能修改
- 置空操作
    + 如果主表中的數(shù)據(jù)被刪除了, 從表中對(duì)應(yīng)的字段變?yōu)閚ull, 我們就稱之為置空操作
    + 流入: 主表中id為1的人被刪除了, 那么從表中的stuid變?yōu)閚ull
- 級(jí)聯(lián)操作
    + 如果主表發(fā)生了變化, 從表也跟著變化, 我們就稱之為級(jí)聯(lián)操作
    + 例如: 主表中'lnj'的id從1變?yōu)?, 那么從表中的stuid也從1變?yōu)?

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

示例一:
create table stugrade(
    id int auto_increment primary key,
    stuid int,
    score float,
    #注意點(diǎn): 一般在企業(yè)開(kāi)發(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)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,687評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,640評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,957評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,682評(píng)論 6 413
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 56,011評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評(píng)論 3 449
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,183評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,714評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,435評(píng)論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,665評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,838評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,251評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,588評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,379評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,627評(píng)論 2 380

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