007_SQL约束
1. SQL約束用于規(guī)定表中的數(shù)據(jù)規(guī)則。如果存在違反約束的數(shù)據(jù)行為, 行為會(huì)被約束終止。
2. 約束可以在創(chuàng)建表時(shí)規(guī)定(通過(guò) create table 語(yǔ)句), 或者在表創(chuàng)建之后規(guī)定(通過(guò)alter table語(yǔ)句)。
3. 在SQL中, 常用的有如下約束
3.1. not null: 指示某列不能存儲(chǔ)null值。
3.2. unique: 保證某列的每行必須有唯一的值。
3.3. primary key: not null和unique的結(jié)合。確保某列(或兩個(gè)列多個(gè)列的結(jié)合)有唯一標(biāo)識(shí), 有助于更容易更快速地找到表中的一個(gè)特定的記錄。
3.4. foreign key: 保證一個(gè)表中的數(shù)據(jù)匹配另一個(gè)表中的值的參照完整性。
3.5. check: 保證列中的值符合指定的條件。
3.6. default: 規(guī)定沒(méi)有給列賦值時(shí)的默認(rèn)值。
4. not null約束
4.1. 在默認(rèn)的情況下, 數(shù)據(jù)庫(kù)字段基本都是null值。但是實(shí)際開(kāi)發(fā)時(shí), 盡可能保證字段不為空, 因?yàn)閿?shù)據(jù)為空沒(méi)辦法參與運(yùn)算。null一般配合default使用: default null。
4.2. not null約束強(qiáng)制字段始終包含值。這意味著, 如果不向字段添加值, 就無(wú)法插入新記錄或者更新記錄。
4.3. 創(chuàng)建一個(gè)notNull表使用not null約束和null默認(rèn)值。
4.4. 向notNull表中只插入name值, 會(huì)報(bào)錯(cuò)提示:Field 'age' doesn't have a default value, 因?yàn)槲覀冊(cè)O(shè)置age為not null, 也沒(méi)有默認(rèn)值。向notNull表中只插入age值, 會(huì)插入成功, 因?yàn)閚ame默認(rèn)是為空的。
4.5. 給name字段添加not null約束(其實(shí)就是修改列)。
4.6. 刪除name字段的not null約束(其實(shí)就是修改列)。
5. default約束
5.1. 如果某一種數(shù)據(jù)會(huì)經(jīng)常性的出現(xiàn)某個(gè)具體的值, 可以在一開(kāi)始就指定好, 在需要真實(shí)數(shù)據(jù)的時(shí)候, 用戶可以選擇性的使用默認(rèn)值。
5.2. 創(chuàng)建一張defaultValue表, sex字段使用默認(rèn)值。
5.3. 在插入數(shù)據(jù)的時(shí)候不給sex字段賦值, 就使用默認(rèn)值。
5.4. 給name字段添加默認(rèn)值約束。
5.5. 刪除name字段的默認(rèn)值約束
6. unique約束
6.1. unique約束唯一標(biāo)識(shí)數(shù)據(jù)庫(kù)表中的每條記錄。
6.2. 每個(gè)表可以有多個(gè)unique約束, 唯一鍵允許為空, 但不能重復(fù), 空字段不做唯一性比較, 也就是說(shuō)可以允許多個(gè)null值。
6.3. 唯一約束實(shí)際上也是一個(gè)索引。
6.4. 創(chuàng)建一個(gè)uniqueConstraints1表, 并在id字段使用唯一約束。
6.5. 創(chuàng)建一個(gè)uniqueConstraints2表, 并在id字段使用唯一約束, 約束名字為uc2。
6.6. 創(chuàng)建一個(gè)uniqueConstraints3表, 并在id和name字段使用唯一約束。
6.7. 創(chuàng)建一個(gè)uniqueConstraints4表, 并在id和name字段使用唯一約束, 約束名字為uc4。
6.8. 撤銷unique約束。
6.9. 添加unique約束。
6.10. 插入表數(shù)據(jù), 唯一列可以插入null(因?yàn)槲覀円苍O(shè)置了允許為空), 多行數(shù)據(jù)可以有多個(gè)null。當(dāng)插入相同值時(shí), 就會(huì)報(bào)錯(cuò)。
7. primary key約束
7.1. primary key約束唯一標(biāo)識(shí)數(shù)據(jù)庫(kù)表中的每條記錄。
7.2. 主鍵列不能包含null值。
7.3. primary key約束擁有自動(dòng)定義的unique約束。
7.4. 每個(gè)表都應(yīng)該有一個(gè)主鍵, 并且每個(gè)表只能有一個(gè)主鍵。
7.5. 主鍵有單主鍵和復(fù)合主鍵之分。
7.6. 創(chuàng)建一個(gè)primaryKey1表, 并給id字段添加主鍵約束。
7.7. 創(chuàng)建一個(gè)primaryKey2表, 并給id字段添加主鍵約束, 約束名為pk2。
7.8. 創(chuàng)建一個(gè)primaryKey3表, 并給id和name字段添加主鍵約束。
7.9. 創(chuàng)建一個(gè)primaryKey4表, 并給id和name字段添加主鍵約束, 約束名為pk4。
7.10. 刪除主鍵約束。
7.11. 添加主鍵約束。
8. 自增長(zhǎng)auto_increment
8.1. auto_increment會(huì)在新記錄插入表中時(shí)生成一個(gè)唯一的數(shù)字。
8.2. 一般使用主鍵和自增長(zhǎng)搭配使用。
8.3. auto_increment對(duì)應(yīng)的字段, 如果把一個(gè)NULL插入到一個(gè)AUTO_INCREMENT數(shù)據(jù)列里去, MySQL將自動(dòng)生成下一個(gè)序列編號(hào)。
8.4. 默認(rèn)地, auto_increment的開(kāi)始值是1, 每條新記錄遞增1。
8.5. 創(chuàng)建autoIncrement1表, id是主鍵, 并且自動(dòng)增長(zhǎng)。
8.6. 插入幾條數(shù)據(jù)id字段都傳入NULL值, id會(huì)自動(dòng)從1開(kāi)始遞增。
8.7. 刪除數(shù)據(jù), 從新插入, 自動(dòng)增長(zhǎng)列是從之前的最大值繼續(xù)開(kāi)始增長(zhǎng)的, 并不是從我們表中已有數(shù)據(jù)的值開(kāi)始增長(zhǎng)。說(shuō)明MySQL自己維護(hù)了一個(gè)序列編號(hào), 不受我們刪除數(shù)據(jù)的影響。
8.8. 設(shè)置自動(dòng)遞增從100開(kāi)始。
8.9. 插入數(shù)據(jù), 查詢自動(dòng)遞增從100開(kāi)始的表數(shù)據(jù)。
8.10. 刪除字段的自動(dòng)遞增(其實(shí)就是修改列)。
8.11. 給字段添加自動(dòng)遞增(其實(shí)就是修改列)。
9. foreign key約束
9.1. 一個(gè)表中的foreign key指向另一個(gè)表中的unique key(唯一約束的鍵)。
9.2. foreign key約束能防止非法數(shù)據(jù)插入外鍵列, 因?yàn)樗仨毷撬赶虻哪莻€(gè)表中的值之一。
9.3. 添加外鍵約束的同時(shí)會(huì)添加一個(gè)唯一約束。
9.4. 創(chuàng)建一個(gè)User表, id是主鍵。創(chuàng)建一個(gè)Orders表, id是主鍵, uid是外鍵, uid指向User表的id列。
9.5. 卸載外鍵約束。
9.6. 添加外鍵約束。
10. check約束
10.1. check約束用于限制列中的值的范圍。
10.2. 如果對(duì)單個(gè)列定義check約束, 那么該列只允許特定的值。
10.3. 創(chuàng)建一個(gè)Check1表, 給id列添加大于0約束。
10.4. 創(chuàng)建一個(gè)Check2表, 給id列添加大于0約束, 并且設(shè)置約束名為c2。
10.5. 創(chuàng)建一個(gè)Check3表, 給id列添加大于0和name列姓李約束。
10.6. 創(chuàng)建一個(gè)Check4表, 給id列添加大于0和name列姓李約束, 并且設(shè)置約束名為c4。
10.7. 刪除check約束。
10.8. 添加check約束。
11. 列描述comment
11.1. comment沒(méi)有實(shí)際含義, 專門(mén)用來(lái)描述字段, 會(huì)根據(jù)表創(chuàng)建語(yǔ)句保存, 用來(lái)給程序員或DBA來(lái)進(jìn)行了解。
11.2. 創(chuàng)建commentDesc表, 使用comment進(jìn)行字段描述。
11.3. 刪除name字段的comment描述(其實(shí)就是修改列)。
11.4. 添加name字段的comment描述(其實(shí)就是修改列)。
12. zerofill自動(dòng)填充0
12.1. 如果某一數(shù)值列規(guī)定了zerofill, 則自動(dòng)把此列變?yōu)闊o(wú)符號(hào)整數(shù)。如果數(shù)據(jù)長(zhǎng)度沒(méi)有達(dá)到規(guī)定長(zhǎng)度, 則在數(shù)據(jù)前自動(dòng)填充0。只能用于約束數(shù)值類型。
12.2. 創(chuàng)建zeroFill表, age字段使用zerofill。
12.3. 插入數(shù)據(jù), age的值是16, 不滿足11為長(zhǎng)度, 使用0來(lái)填充。zerofill屬性只是設(shè)置了一種格式化輸出而已,數(shù)據(jù)庫(kù)內(nèi)部存儲(chǔ)的還是本來(lái)的數(shù)。
12.4. 刪除age字段的零填充(其實(shí)就是修改列)。
12.5. 添加age字段的零填充(其實(shí)就是修改列)。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
- 上一篇: 006_表的CRUD的操作
- 下一篇: 008_表内容的插入删除修改