深入理解數(shù)據(jù)庫(kù)之表的唯一、自增等七大約束
真正約束字段的是數(shù)據(jù)類型,但是數(shù)據(jù)類型約束很單一,需要有一些額外的約束,更好的保證數(shù)據(jù)的合法性,從業(yè)務(wù)邏輯角度保證數(shù)據(jù)的正確性。今天我們一起使用一下主要的幾個(gè)約束,null/not null,default, comment, zero?ll,primary key,auto_increment,unique。
1、空屬性
有兩個(gè)取值,null(默認(rèn))和not null(此列屬性不允許為空,必須做數(shù)據(jù)插入)。
數(shù)據(jù)庫(kù)默認(rèn)字段基本都是字段為空,但是實(shí)際開發(fā)時(shí),盡可能保證字段不為空,因?yàn)閿?shù)據(jù)為空沒辦法參與運(yùn)算。
舉例使用null:
使用not null:
在tt1中我們將per_age設(shè)為not null,我們可以觀察到,
第一次插入數(shù)據(jù)時(shí)只給per_age設(shè)置了值,成功。
第二次,只給per_name設(shè)置了值,失敗。
2、默認(rèn)值-default
如果某一種數(shù)據(jù)會(huì)經(jīng)常性的出現(xiàn)某個(gè)具體的值,可以在一開始就指定好,在需要真實(shí)數(shù)據(jù)的時(shí)候,用戶可以選擇性的使用默認(rèn)值。
eg,新建表如下(默認(rèn)值一般與not null配合使用 ):
插入如下數(shù)據(jù),觀察結(jié)果:
所以,默認(rèn)值的生效:數(shù)據(jù)在插入的時(shí)候不給該字段賦值,就使用默認(rèn)值
我們看一下時(shí)間戳的默認(rèn)值:
(desc:查看表的結(jié)構(gòu))
注意,set和enum不允許設(shè)默認(rèn)值。
3、列描述-comment
comment,沒有實(shí)際含義,專門用來(lái)描述字段,會(huì)根據(jù)表創(chuàng)建語(yǔ)句保存,用來(lái)給程序員或DBA來(lái)進(jìn)行了解。
eg,新建表如下:
觀察上圖,我們用desc是查看不到comment的描述信息的。
我們學(xué)一條命令show(查看當(dāng)前數(shù)據(jù)庫(kù)的描述信息),如下:
(\G是為了讓查看結(jié)果格式整齊)
這樣,肯定有人以為和注釋是一樣的,其實(shí)不然,comment不等同于注釋。
測(cè)試如下:
(注釋用– )
觀察到用desc兩者都看不到,我們用show試試:
可以看到注釋是看不出來(lái)的。
4、zerofill -自動(dòng)填充0
如果某一數(shù)值列規(guī)定了zerofill,則自動(dòng)把此列變?yōu)闊o(wú)符號(hào)整數(shù)。
若規(guī)定了zerofill的數(shù)據(jù)列,如果數(shù)據(jù)長(zhǎng)度沒有達(dá)到規(guī)定長(zhǎng)度,則在數(shù)據(jù)前自動(dòng)填充0,
eg: int(5) zerofill 123 –>00123
舉例如下:
新建表:
查看表結(jié)構(gòu):
可以看到此列變?yōu)闊o(wú)符號(hào)整數(shù)。
我們插入數(shù)據(jù):
因?yàn)槲覀冊(cè)O(shè)置了5位,而數(shù)據(jù)只有3位,因此前兩次自動(dòng)填充為0。
那如果數(shù)據(jù)大于5位呢?如下:
則沒有必要填充。
需要注意的是,zero?ll屬性只是設(shè)置了一種格式化輸出而已,數(shù)據(jù)庫(kù)內(nèi)部存儲(chǔ)的還是本來(lái)的數(shù)。
我們可以用hex函數(shù)來(lái)觀察,如下:
5、主鍵約束 - primary key
主鍵用于唯一約束字段數(shù)據(jù),使用主鍵約束的字段,不能為空,不能重復(fù)。主鍵所在的列為整數(shù)類型,一張表有且只有一個(gè)主鍵。主鍵有單主鍵和復(fù)合主鍵之分。
單主鍵
舉例如下:
查看表結(jié)構(gòu),id的key值為PRI,id為主鍵
插入數(shù)據(jù):
如上圖,第一次插入id相同,插入失敗,證明主鍵不能重復(fù)。
第二次插入成功。
復(fù)合主鍵
多個(gè)屬性組合起來(lái)不能重復(fù) eg:1-101
舉例如下:
id-sushe為復(fù)合主鍵,如下,id和sushe的key值都為PRI.
插入數(shù)據(jù):
成功,插入了1-101即2-101兩組數(shù)據(jù)。
再插入數(shù)據(jù),
因?yàn)?-101重復(fù),插入失敗。
刪除主鍵
alter table 表名 drop primary key;
我們以上例中tt7為例:
刪除后我們插入重復(fù)的數(shù)就可以了:
創(chuàng)建表以后追加主鍵
alter table 表名 add primary key(字段1);
注意:字段1不能為空,不能重復(fù)。
6、自增長(zhǎng)-auto_increment
auto_increment:當(dāng)對(duì)應(yīng)的字段,不給值,會(huì)自動(dòng)的被系統(tǒng)觸發(fā),系統(tǒng)會(huì)從當(dāng)前字段中已經(jīng)有的最大值+1操作, 得到一個(gè)新的不同的值。
注意:任何一個(gè)字段要自增長(zhǎng),前提是本身為索引,(key有值)、自增長(zhǎng)必須為整數(shù)、一張表有且只能有一個(gè)自增長(zhǎng)
主鍵和自增長(zhǎng)搭配使用:
id+auto_increment:邏輯主鍵
舉例如下:
查看表結(jié)構(gòu)可以看出來(lái)id為自增長(zhǎng)。
插入數(shù)據(jù):
可以看出自增值是從1開始的。
若我們?cè)O(shè)置了自增數(shù)值呢?
如下:
證明了系統(tǒng)會(huì)從當(dāng)前字段中已經(jīng)有的最大值+1操作, 得到一個(gè)新的不同的值。
那若我們刪掉我們?cè)O(shè)置的數(shù)呢?
現(xiàn)在只剩下1和2了,我們插入數(shù)據(jù):
發(fā)現(xiàn)是接著之前最大的數(shù)的。
**因此,若指定自增數(shù)值后,以后的數(shù)依次為基礎(chǔ)。
若刪除指定列后,還是以最大值(已經(jīng)達(dá)到的值)為基礎(chǔ)自增。**
7、唯一鍵-unique
一張表中有往往有很多字段需要唯一性,數(shù)據(jù)不能重復(fù),但是一張表中只能有一個(gè)主鍵:唯一鍵就可以解決表中有多個(gè)字段需要唯一性約束的問題。
唯一鍵的本質(zhì)和主鍵差不多,唯一鍵允許為空,但不能重復(fù),一張表可以有多個(gè)字段設(shè)置唯一,而且可以多個(gè)為空,空字段不做唯一性比較,也就是說(shuō)可以允許多個(gè)null值。
證明不能重復(fù),舉例如下,id為唯一鍵:
插入數(shù)據(jù):
再插入:
插入失敗。
對(duì)于空值,插入:
再次插入id為空值的數(shù)據(jù):
證明了空字段不做唯一性比較,可以允許多個(gè)null值。
到此這篇關(guān)于深入理解數(shù)據(jù)庫(kù)之表的唯一、自增等七大約束的文章就介紹到這了,更多相關(guān)數(shù)據(jù)庫(kù)七大約束內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 淺談關(guān)系型數(shù)據(jù)庫(kù)中的約束及應(yīng)用場(chǎng)景
- MySQL數(shù)據(jù)庫(kù)表中的約束詳解
- MySQL數(shù)據(jù)庫(kù)的約束使用實(shí)例
- MySQL數(shù)據(jù)庫(kù)約束操作示例講解
- 一文理解MySQL數(shù)據(jù)庫(kù)的約束與表的設(shè)計(jì)
- SQL?Server數(shù)據(jù)庫(kù)創(chuàng)建表及其約束條件的操作方法
- MySQL數(shù)據(jù)庫(kù)的約束限制詳解
- MySQL數(shù)據(jù)庫(kù)表約束講解
- MySQL示例講解數(shù)據(jù)庫(kù)約束以及表的設(shè)計(jì)
- MySQL數(shù)據(jù)庫(kù)如何給表設(shè)置約束詳解
- MySQL?數(shù)據(jù)庫(kù)的約束及數(shù)據(jù)表的設(shè)計(jì)原理
- Mysql關(guān)于數(shù)據(jù)庫(kù)是否應(yīng)該使用外鍵約束詳解說(shuō)明
相關(guān)文章
Navicat保存查詢和查詢文件放在哪個(gè)位置最佳方法推薦
這篇文章主要介紹了Navicat保存查詢和查詢文件放在哪個(gè)位置,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08使用 Navicat 創(chuàng)建數(shù)據(jù)庫(kù)并用JDBC連接的操作方法
這篇文章主要介紹了使用 Navicat 創(chuàng)建數(shù)據(jù)庫(kù)并用JDBC連接的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Navicat Premium15安裝及破解教程詳解親測(cè)有效(附破解失敗解決方案)
這篇文章主要介紹了Navicat Premium15安裝及破解教程詳解親測(cè)有效,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Linux下 mysql oracle 簡(jiǎn)單使用手冊(cè)
1.linux下使用Mysql與oracle的 簡(jiǎn)單說(shuō)明2009-06-06把Navicat中數(shù)據(jù)庫(kù)所有表導(dǎo)出的方法
通過Navicat導(dǎo)出數(shù)據(jù)庫(kù)中的數(shù)據(jù)是比較常用的操作之一,下面這篇文章主要給大家介紹了關(guān)于如何把Navicat中數(shù)據(jù)庫(kù)所有表導(dǎo)出的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06access mysql mssql 隨機(jī) 10條數(shù)據(jù)的sql語(yǔ)句
好多情況下,大家需要隨機(jī)抽取幾個(gè)數(shù)據(jù),當(dāng)然數(shù)據(jù)是從數(shù)據(jù)庫(kù)來(lái)的,所以腳本之家特為大家準(zhǔn)備了一些。2009-05-05sql語(yǔ)句實(shí)現(xiàn)行轉(zhuǎn)列的3種方法實(shí)例
將列值旋轉(zhuǎn)為列名(即行轉(zhuǎn)列)是我們?cè)陂_發(fā)中經(jīng)常會(huì)遇到的一個(gè)需要,下面這篇文章主要給大家介紹了關(guān)于sql語(yǔ)句實(shí)現(xiàn)行轉(zhuǎn)列的3種方法,分別給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-02-02如何利用SQL語(yǔ)句創(chuàng)建數(shù)據(jù)庫(kù)詳解
數(shù)據(jù)庫(kù)就是一個(gè)文件系統(tǒng),訪問數(shù)據(jù)的時(shí)候需要通過標(biāo)準(zhǔn)的SQL語(yǔ)言來(lái)完成,下面這篇文章主要給大家介紹了關(guān)于如何利用SQL語(yǔ)句創(chuàng)建數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下2022-06-06SQL Server數(shù)據(jù)庫(kù)性能優(yōu)化技術(shù)
SQL Server數(shù)據(jù)庫(kù)性能優(yōu)化技術(shù)...2007-06-06