柚子快報激活碼778899分享:數(shù)據(jù)庫 【MySQL】表的約束
柚子快報激活碼778899分享:數(shù)據(jù)庫 【MySQL】表的約束
文章目錄
1. 約束概念2. 空屬性3. 默認值5. comment——列描述6. zerofill7. 主鍵8. 復合主鍵9. 自增長10. 唯一鍵關于唯一鍵的理解
11. 外鍵外鍵的理解
1. 約束概念
表中一定要有各種約束,通過約束,讓未來插入數(shù)據(jù)庫表中的數(shù)據(jù)是符合預期的 約束本質(zhì)是 通過技術(shù)手段,倒逼程序員 插入正確的數(shù)據(jù) 站在mysql的視角,凡是插入進來都是符合數(shù)據(jù)約束的 約束的最終目標:保證 數(shù)據(jù)的完整性和可預期性
如:使用VS時,當代碼寫錯了,編譯器就會報錯,如果不改錯而執(zhí)行代碼,就會導致執(zhí)行不通過 必須將錯誤修改正確,才能執(zhí)行才能通過
2. 空屬性
在mysql中 NULL表示沒有 ’ ’ 表示空串,有只不過是空的
輸入 select NULL; 查詢時發(fā)現(xiàn)什么都沒有
共有兩種默認值:null (默認為空) 和 not null(不為空) 數(shù)據(jù)庫默認字段基本都是字段為空,但是實際開發(fā)時,盡可能保證字段不為空,因為數(shù)據(jù)為空沒辦法參與計算
創(chuàng)建一個班級表,內(nèi)部包含 一個 班級名稱和 教室名稱 以及其他 其中班級名稱和班級教室都不能為空,所以設置 not null 進行約束 而其他沒有約束,也就沒有帶 not null
輸入 desc myclass; 查看myclass 表的更詳細信息 Null 表示對應 列未來做插入時,是否為空 如: class_name 這一列未來做插入時 不能為空 other 這一列 未來做插入時,可以為空
向myclass表中 插入 班級名 初一6班, 班級教室 111教室,其他為普通班 時,是可以成功插入的
再次插入時,沒有給other具體的值,此時依舊可以插入成功 當查看表 的信息時,other為NULL (other沒有添加非空約束)
當插入班級名稱 以及 教室名稱設置為空時,就會插入失敗 (因為class_room 添加了非空約束)
3. 默認值
某一種數(shù)據(jù)會經(jīng)常性的出現(xiàn)某個具體的值,可以在一開始就指定好,在需要真實數(shù)據(jù)的時候,用戶可以選擇性的使用默認值
創(chuàng)建一張表t11 ,內(nèi)部包含 不能為空的名字 、 默認值為18 的年齡、 默認為男的性別
當插入 名字為張三、年齡為19、性別為女,可以插入成功 當只插入名字李四時,也是可以插入成功的 顯示表的信息時,年齡和性別都為默認值
所以 deault 如果設置了,用戶將來插入,有具體的數(shù)據(jù)了,就用用戶的,沒有就用默認的
創(chuàng)建一張表 t12,內(nèi)部包含 不能為空的名字、 默認為18的年齡、 不能為空且默認為男的性別 性別 把 deault 和not null 同時設置了
若向t11表中插入年齡和性別,而不插入名字 就會報錯,沒有默認值存在
結(jié)論: 若沒有明確指定一列要插入,用的是default 如果建表中對應的列默認沒有default值,就無法直接插入
向t11表中只插入名字和年齡,不插入性別 由于性別有默認值存在,所以會使用默認值 所以查詢表信息時,發(fā)現(xiàn)趙六的性別為默認值男
如果忽略某一列,若設定了默認值且默認值不為空,則可以直接插入
default 作用于 當用戶忽略這一列時,如果設置了默認值,則使用默認值 not null 作用于 當用戶想插入時,若輸入null 則會報錯 ,約束用戶輸入合法數(shù)據(jù)
5. comment——列描述
comment 后面跟的相當于注釋 創(chuàng)建一張表 t13,內(nèi)部包含 用戶名 、默認為男的用戶性別
輸入 show create table t13 \G 獲取t13表更詳細信息 就可以看到列信息的描述字段
6. zerofill
創(chuàng)建一張表 t14,內(nèi)部包含 一個 無符號的整形 a 與 無符號的整形 b 兩者都不能為空
輸入 show create table t14 \G 查詢t14表中更詳細的信息 發(fā)現(xiàn) 默認 mysql 的int 帶了一個10 無符號范圍為0 到42億多,所以需要寬度10去表示 所以 無符號int 的默認寬度為10
向t14表中插入 1 和 2, 輸入 select *from t14; 查看t14表結(jié)構(gòu) 目前來看沒有什么問題
將t14表中的b成員類型改為 無符號int 并添加 向zerofill
再次輸入 select *from t14; 查看t14表的結(jié)構(gòu) a沒有變化,而b從 2變成 0000000002
zerofill的作用為 給特定的一列添加 zerofill屬性 對于結(jié)果,如果顯示的寬度 少于 限定的寬度,則會自動填0 如:int類型的限定寬度為10,則輸入的2 顯示寬度為1,就默認在2前面全部補充0 ,就把 2變?yōu)?0000000002
將t14表中的b成員類型改為 int的限定寬度為3
分別插入 1 20 和 1 2000 可以發(fā)現(xiàn) 當小于限定寬度時,會在前面自動填充0 如:20 顯示寬度為2 ,小于限定寬度 3 ,所以在前面填充0
而大于限定寬度時,就什么都不做 如:2000 顯示寬度為4,大于限定寬度3,就直接顯示
7. 主鍵
primary key 用來唯一的約束該字段里面的數(shù)據(jù),不能重復,不能為空,一張表最多只有一個主鍵 主鍵所在的列 通常是整數(shù)類型
創(chuàng)建一張表 test_key,內(nèi)部包含 被設置為主鍵的學號 以及 不能設置為空的 名字
學號id中并沒有設置為非空,但是查詢test_key表結(jié)構(gòu)時,發(fā)現(xiàn)自動將其設置為 not null 由于學號被設置為主鍵 所以查詢時 在key 列(表示當前列是否為主鍵列),發(fā)現(xiàn)id所在列為 PRI (當前為主鍵列)
將 id為1,名字為劉備 插入到test_key表中,可以插入成功
當再次在相同的id中,插入不同的名字時,就會報錯,出現(xiàn) 主鍵沖突 所以就需要去其他的id中去插入
主鍵約束:如果想要在一個表中插入,主鍵是不可以沖突的,如果沖突 就會插入失敗
輸入 alter table test_key drop primart key; 將 主鍵從test_key表中刪除 輸入 desc test_key; 發(fā)現(xiàn)當前的test_key表中不存在主鍵
再次輸入 insert into test_key values(1,‘張飛’); 向test_key表中插入 1 張飛 ,是可以插入成功的(沒有主鍵約束)
也可以將表建好后,再添加主鍵 當前的test_key 表是沒有主鍵存在的
輸入 alter table test_key add primary key(id); 向 test_key表中的id成員插入 主鍵 但是會報錯,因為 當前test_key表中存在主鍵沖突 必須將其解決,才能添加主鍵
輸入 delete from test_key where name=‘張飛’; 即可刪除test_key表中的張飛信息
再次輸入 alter table test_key add primary key(id); 即可再test_key表中加入主鍵
8. 復合主鍵
雖然一個表中只能有一個主鍵,但是并不意味著一個表中的主鍵,只能添加給一列 即 一個主鍵 也可以被添加到多列 ——復合主鍵
創(chuàng)建一張表 pick_course,內(nèi)部包含 無符號int的id、課程編號、課程分數(shù) 為了使 學生 與課程編號 是一對一的關系,所以將 id 和course_id 都包含 主鍵
輸入 desc pick_course; 查看pick_course表結(jié)構(gòu) id和course_id中都包含同一個主鍵
第一次插入 1200 50 90 ,可以插入成功 第二次插入 1300 50 80, 也可以插入成功 因為 id與course_id是一對一關系,即只是不能有相同的id與course_id存在
再次插入 1200 50 40 ,因為與第一次插入 1200 50 重復了 引起 主鍵沖突,就會報錯
9. 自增長
auto_increment :當對應的字段 不給值,會自動的被系統(tǒng)觸發(fā),系統(tǒng)會從當前字段中已經(jīng)有的最大值+1操作,得到一個新的不同的值,通常和主鍵搭配使用,作為邏輯主鍵
自增長的特點: 任何一個字段要自增長,前提key一欄要有值 自增長字段必須是整數(shù) 一張表最多只能有一個自增長
加入 auto_increment ,表示當前這一列屬于自增式主鍵 創(chuàng)建一張表 tt21,內(nèi)部包含 自增式主鍵 的id 以及 不能為空的名字
輸入 desc tt21; 查看tt21表結(jié)構(gòu) key列的PRI 表示 id為主鍵列 Extra列的auto_increment 表示 id列是自增的
分別只插入 名字 a和 名字 b 輸入 select * from tt21; 查看tt21表結(jié)構(gòu),發(fā)現(xiàn)id會從1開始 并加1(保證跟別人不沖突,并且是連續(xù)的)
若想自定義id進行插入 ,也是可以的 并且當再次插入相同id時,就會引起主鍵沖突,從而插入失敗
當前面id為500時,再次插入數(shù)據(jù),就會id就會默認從501開始
創(chuàng)建表 tt23,并在表外設置id的默認值從400開始
只插入名字e時,id就會默認從400開始
10. 唯一鍵
一張表中有很多字段需要唯一性,數(shù)據(jù)不能重復,但是一張表中只能有一個主鍵 唯一鍵就可以解決表中多個字段需要唯一約束的問題
唯一鍵和主鍵差不多,唯一鍵允許為空,而且可以多個為空,空字段不做唯一性比較
使用 unique 創(chuàng)建唯一鍵 (寫成 unique 或者 unique key 都可以) 創(chuàng)建一張表 stu ,內(nèi)部包含 擁有唯一鍵的id 以及 不為空的名字
輸入 desc stu; 查看stu表結(jié)構(gòu) 發(fā)現(xiàn) key列 內(nèi)部 變?yōu)?UNI
第一次插入 id為1234,名字為李四,插入成功 第二次插入與第一次插入的id相同,就導致 唯一鍵 沖突,從而插入失敗
若插入id為空,雖然名字相同,但依舊可以插入成功
若連續(xù)插入 NULL 值,皆可插入成功
唯一鍵表達了類似于主鍵的功能 但是唯一鍵可以為空,并且空值可以多次插入(NULL不參與計算) 而主鍵不可以為空
關于唯一鍵的理解
創(chuàng)建一張表student, 內(nèi)部包含 id 、名字、電話 將成員id設置為主鍵
將id為1234、名字為張三、電話為123456 插入到student表中,并插入成功
若將id修改與名字修改 而電話不變,將其插入到student表中 張三和李四的電話號相同 但是正常情況下是不存在,因為每一個人的電話號是唯一的
當想要通過電話號去尋找對應的人時,就發(fā)現(xiàn)無法準確找到對應的人
所以在主鍵保證唯一性的同時,其他字段有可能也需要唯一性,此時就需要借助唯一鍵來實現(xiàn)
重新創(chuàng)建 表student,內(nèi)部包含 主鍵的id、不為空的名字、唯一鍵的電話號、唯一鍵的qq號
輸入 desc student; 查看student表結(jié)構(gòu) 為了保證電話號和qq號的唯一性,所以兩者包含唯一鍵
當將 id為1234、名字為李四、電話號為123456、qq號為456789 成功插入時 再次插入id 相同的人時,就會因為 主鍵沖突 而插入失敗
當將 id為1234、名字為李四、電話號為123456、qq號為456789 成功插入時 再次插入 電話號與qq號 相同的人時,就會因為 唯一鍵沖突 而插入失敗
11. 外鍵
外鍵用于主表和從表之間的關系,外鍵約束主要定義在從表上,主表則必須是有主鍵約束或者unique約束(唯一鍵約束) 當定義外鍵后,要求外鍵列數(shù)據(jù)必須在主表的主鍵列存在或為null
語法: foregin key(字段名) references 主表(列)
外鍵的理解
創(chuàng)建一張學生表student,包含 主鍵且自增長的id 、不為空的名字、不為空的電話號、班級號 (正常來說 電話號 是唯一的,應該加上唯一鍵,這里只是初步測驗,所以沒有加)
輸入 desc student; 查看student表結(jié)構(gòu)
再創(chuàng)建一個班級表class,內(nèi)部包含 主鍵的id、不為空的名字
向class表中 插入 班級1 通信101 ,以及 班級2 通 信102
向student表中第一次插入 名字為張三、電話為123456、1號班級 由于id擁有主鍵并且為自增長的,所以默認從1開始,每次加1 第二次插入 名字為李四、電話為456789、2號班級
由于張三是1號班級的,所以查找1號班級,發(fā)現(xiàn)通信101
假設 向student表中 誤插入3號班級中
邏輯上存在有一個學生所屬的班級 并不存在 若:王五屬于3號班級,但是class表中只有1號和2號班級 MySQL數(shù)據(jù)庫就要通過數(shù)據(jù)手段在邏輯上規(guī)避 并不符合要求的情況的產(chǎn)生
輸入 delete from class where d=1; 將 class表中 id值為1 刪除 此時再次查看 class表,發(fā)現(xiàn) 只剩下 id值為2
但是這種刪除不合理 因為在student表 還有 屬于1號班級的信息 存在
這樣就會導致每次操作前 ,就需要查看是否影響其他表中的信息
班級表可以看作是主表,學生表可以看作 從表
外鍵需要考慮兩層面的關系:關聯(lián)關系 和 約束關系
student表中的class_id 有關聯(lián)關系,但是沒有約束關系
若要插入一名學生,但是插入的班級并不存在,就不允許插入,使其插入一個合法的id
為了創(chuàng)建出主表和從表的關系,就需要使用 外鍵 重新創(chuàng)建從表
先輸入 drop table student; 將從表 student 去掉
再次創(chuàng)建從表 student,內(nèi)部包含 主鍵的id、不為空的name、唯一鍵的telphone、class_id 并使 student表中的 class_id作為外鍵,與 class表中的id 產(chǎn)生外鍵約束
輸入 desc studnet; 查看student表的結(jié)構(gòu) class_id對應的 default列中的 MUL 表示 外鍵約束
輸入 desc class ; 查看class表的結(jié)構(gòu) 發(fā)現(xiàn)有id值為1的通信101 和id值為2的通信102
第一次插入 id值為100 、名字為張三、電話為1234、班級號為1 第二次插入 id值為101、名字為李四、電話為4567 、班級號為2 兩者都插入成 輸入 select * from student; 查看student表的結(jié)構(gòu)
當插入到 3號班級時,因為 class表中只有1號班級和2號班級 ,并不存在3號班級,所以就會發(fā)生外鍵約束
同樣若想刪除 class 主表中的id值為1的班級 是不可以的,因為id值為1的班級在 student 從表中存在信息
外鍵約束 保證 表跟表之間數(shù)據(jù)做刪除時的邏輯關系 和數(shù)據(jù)的完整性
先將student從表中的id值為100 1號班級的信息 刪除 再次 就可以刪除掉 class表中的 1號班級了
想要使用外鍵 ,就需要先保證 從表和主表的關聯(lián)關系(學生表 和班級表) 再 產(chǎn)生外鍵約束 (不會在學生表中插入一個不存在班級的學生,也不會在刪除 在學生表中有信息的 班級)
柚子快報激活碼778899分享:數(shù)據(jù)庫 【MySQL】表的約束
參考閱讀
本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。