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