前言
?歡迎來到小K的MySQL專欄,本節(jié)將為大家?guī)鞰ySQL約束的概念 | 非空約束 | 唯一約束 | 主鍵約束 | 自增長約束的分享?
1. 約束(Constraint)概念
1.1 為什么需要約束
對(duì)于已經(jīng)創(chuàng)建好的表,雖然字段的數(shù)據(jù)類型決定了所能存儲(chǔ)的數(shù)據(jù)類型,但是表中所存儲(chǔ)的數(shù)據(jù)是否合法并沒有進(jìn)行檢查。在具體使用MySQL 軟件時(shí),如果想針對(duì)表中的數(shù)據(jù)做一些完整性檢查操作,可以通過表的約束來完成。
數(shù)據(jù)完整性(Data Intergrity
)是指數(shù)據(jù)的精確性(Accuracy
)和可靠性(Reliability
)。他是防止數(shù)據(jù)庫中存在不符合語義規(guī)定的數(shù)據(jù)和防止因錯(cuò)誤信息的輸入輸出造成無效操作或錯(cuò)誤信息而提出來的。
為了保證數(shù)據(jù)的完整性,SQL規(guī)范以約束的方式對(duì)表數(shù)據(jù)進(jìn)行額外的條件限制,主要從以下四個(gè)方面考慮:
- 實(shí)體完整性(Entity Integrity)如:同一張表中,不能存在兩條完全相同無法區(qū)分的記錄
- 域完整性(Domain Integrity)如:年齡范圍0-120,性別范圍 “男/女”
- 引用完整性(Referential Integrity)如:員工所在部門,必須要在部門表中存在
- 用戶自定義完整性(User-defined Integrity)如:用戶名唯一、密碼不能為空等
1.2 什么是約束
約束是表級(jí)的強(qiáng)制規(guī)定。
可以在創(chuàng)建表時(shí)規(guī)定約束(通過``CREATE TABLE語句),或者在表創(chuàng)建之后通過
ALTER T ABLE`語句規(guī)定約束。
1.3 約束分類
1.3.1 根據(jù)約束的字段分類
- 單列約束
- 多列約束
1.3.2 根據(jù)約束的作用范圍分類
- 列級(jí)約束
- 表級(jí)約束
區(qū)別
① 位置不同 :列級(jí)約束是寫在列的后面,標(biāo)記約束時(shí)寫在所有字段的最后面
② 支持的約束類型不同:列級(jí)約束可以支持所有的約束類型,表級(jí)約束不能支持非空和默認(rèn)
③ 列級(jí)約束不可以起約束名,表記約束可以起約束名(主鍵除外,主鍵使用的PRIMARY KEY)
1.3.3 根據(jù)約束的作用分類
完整性約束關(guān)鍵字 | 說明 |
---|---|
NOT NULL(NK) | 約束字段的值不能為空 |
DEFAULT | 設(shè)置字段的默認(rèn)值 |
UNIQUE KEY(UK) | 約束字段的值是唯一(同一列不能出現(xiàn)相同的值) |
PRIMARAY KEY(PK) | 約束字段為表的主鍵,可以作為該表記錄的唯一標(biāo)識(shí) |
AUTO_INCREMENT | 約束字段的值為自動(dòng)增加 |
FOREIGN KEY(FK) | 約束字段為表的外鍵 |
CHECK() |
-
查看某個(gè)表已有的約束
SELECT * FROM information_schema.TABLE_CONSTRAINTS WHERE table_name='emp';
2. 非空約束(NK)
2.1 概念
當(dāng)數(shù)據(jù)庫表中的某個(gè)字段上的內(nèi)容不希望設(shè)置為NULL時(shí),則可以使用NK約束進(jìn)行設(shè)置。即NK約束在創(chuàng)建數(shù)據(jù)庫表時(shí)為某些字段加上“NOT NULL”約束條件,保證所有記錄中該字段都有值。如果用戶插入的記錄中,該字段為空值,則數(shù)據(jù)庫管理系統(tǒng)會(huì)報(bào)錯(cuò)。
2.2 特點(diǎn)
- 默認(rèn)情況下,所有類型的值都可以是NULL
- 一個(gè)表可以有很多字段指定非空約束
- 空串" "不等于NULL,0也不等于NULL,NULL也不等于NULL
2.3 添加非空約束
- 創(chuàng)建表時(shí)
CREATE TABLE table_name(
字段名 數(shù)據(jù)類型 NOT NULL,
...
);
CREATE TABLE IF NOT EXISTS student
(
id INT NOT NULL,
name VARCHAR(10) NOT NULL,
score DECIMAL(4,1)
)
DESC student;
Tips1:如果我們現(xiàn)在執(zhí)行下面這條語句將會(huì)報(bào)錯(cuò)(Field ‘name’ doesn’t have a default value)
,這是因?yàn)槟J(rèn)值為NULL
,而我們又指定了該字段不能為空
INSERT INTO student(id,score) VALUES(3,79.5);
- 創(chuàng)建之后添加
ALTER TABLE <表名> MODIFY 字段名 數(shù)據(jù)類型 約束;
Tips2:如果我們現(xiàn)在執(zhí)行下面這條語句將會(huì)報(bào)錯(cuò)(Invalid use of NULL value),這是因?yàn)?code>score字段中現(xiàn)在已經(jīng)有空值了
ALTER TABLE student MODIFY score DECIMAL(4,1) NOT NULL;
2.4 刪除非空約束
ALTER TABLE 表名 MODIFY 字段名 數(shù)據(jù)類型 NULL;
#或
ALTER TABLE 表名 MODIFY 字段名 數(shù)據(jù)類型;
3. 唯一約束(UK)
3.1 概念
當(dāng)數(shù)據(jù)庫表中的某個(gè)字段上的內(nèi)容不允許重復(fù)時(shí),則可以使用UK約束進(jìn)行設(shè)置。即UK約束在創(chuàng)建數(shù)據(jù)庫表時(shí)為某些字段加上“UNIQUE”約束條件,保證所有記錄中該字段上的值不重復(fù)。如果用戶插入的記錄中,該字段上的值與其他記錄里該字段上的值重復(fù),則數(shù)據(jù)庫管理系統(tǒng)會(huì)報(bào)錯(cuò)。
3.2 特點(diǎn)
- 同一個(gè)表可以有多個(gè)唯一約束
- 唯一約束允許值為NULL
- 在創(chuàng)建唯一約束的時(shí)候,如果不給唯一約束命名,那么約束名就和字段名相同
3.3 添加唯一約束
- 創(chuàng)建表時(shí)添加
CREATE TABLE table_name(
字段名 數(shù)據(jù)類型 UNIQUE KEY,
...
);
- 創(chuàng)建表后添加
- 方法一
ALTER TABLE <表名> MODIFY 字段名 數(shù)據(jù)類型 UNIQUE;
- 方法二
ALTER TABLE <表名> ADD [CONSTRAINT 約束名] UNIQUE [KEY](字段名);
3.4 刪除唯一約束
- 添加唯一約束的列上會(huì)自動(dòng)創(chuàng)建唯一索引
- 刪除唯一約束只能通過刪除唯一索引的方式刪除
- 刪除時(shí)需要指定唯一索引名,唯一索引名和唯一約束名相同。
- 如果創(chuàng)建唯一約束時(shí)未指定名稱,如果是單列,就默認(rèn)和列名相同;如果是組合列,那么默認(rèn)和()中第一個(gè)列名相同。
ALTER TABLE <表名> DROP INDEX <索引名>;
4. 主鍵約束(PK)
4.1 概念
當(dāng)想用數(shù)據(jù)庫表中的某個(gè)字段來唯一標(biāo)識(shí)所有記錄時(shí),則可以使用PK約束進(jìn)行設(shè)置。即 PK約束在創(chuàng)建數(shù)據(jù)庫表時(shí)為某些字段加上“PRIMARY KEY”約束條件,則該字段可以唯一地標(biāo)示所有記錄。
在數(shù)據(jù)庫表中之所以設(shè)置主鍵,是為了便于數(shù)據(jù)庫管理系統(tǒng)快速地查找到表中的記錄。在具體設(shè)置主鍵約束時(shí),必須要滿足主鍵字段的值是唯一、非空的。由于主鍵可以是單一字段,也可以是多個(gè)字段,因此分為單字段主鍵和多字段主鍵。
4.2 特點(diǎn)
-
主鍵約束相當(dāng)于 唯一約束+非空約束,意味著不允許重復(fù)和NULL值
-
主鍵約束對(duì)應(yīng)著表中的一列或者多列(復(fù)合主鍵)
-
如果是多列組合的復(fù)合主鍵約束,那么這些列都不允許為NULL值,并且組合的值不允許重復(fù)
-
MySQL的主鍵名總是PRIMARY,就算自己命名了主鍵約束名也沒用
-
當(dāng)創(chuàng)建主鍵約束時(shí),系統(tǒng)默認(rèn)會(huì)在所在的列或組合上建立對(duì)應(yīng)的主鍵索引(能夠根據(jù)主鍵查詢的,就根據(jù)主鍵查詢,效率更高),如果刪除主鍵約束,主鍵約束對(duì)應(yīng)的索引就自動(dòng)刪除了
-
需要注意一點(diǎn)的是,不要修改主鍵字段的值。因?yàn)橹麈I是數(shù)據(jù)記錄的唯一標(biāo)識(shí),如果修改了主鍵的值,就有可能會(huì)破壞數(shù)據(jù)的完整性。
4.3 單字段主鍵
- 創(chuàng)建表時(shí)指定主鍵約束
CREATE TABLE table_name(
字段名 數(shù)據(jù)類型 PRIMARY KEY,
...
);
Tips:如果我們現(xiàn)在執(zhí)行下面這條語句將會(huì)報(bào)錯(cuò)(Multiple primary key defined)
CREATE TABLE IF NOT EXISTS test2
(
empno INT PRIMARY KEY, # 列級(jí)約束
ename VARCHAR(10) PRIMARY KEY,
sal DECIMAL(7,1)
)
只允許有一個(gè)!??!
- ALTER TABLE添加主鍵約束
ALTER TABLE <表名> ADD PRIMARY KEY(字段名);
4.4 多字段主鍵(復(fù)合主鍵)
當(dāng)主鍵有多個(gè)字段組合而成時(shí),需要通過SQL語句CONSTRAINT
來實(shí)現(xiàn),語法形式如下:
CREATE TABLE table_name(
字段名 數(shù)據(jù)類型,
...
[CONSTRAINT 約束名] PRIMARY KEY(字段1,字段2...)
);
在上述語句中,在字段定義完之后統(tǒng)一設(shè)置主鍵,PRIMARY KEY關(guān)鍵字括號(hào)中的字段可以有多個(gè),需要通過逗號(hào)分割,用來實(shí)現(xiàn)設(shè)置多字段主鍵。
4.5 刪除主鍵
ALTER TABLE <表名> DROP PRIMARY KEY;
5. 設(shè)置字段值自動(dòng)增加(AUTO_INCREMENT)
5.1 概念
AUTO_INCREMENT是 MySQL 唯一擴(kuò)展的完整性約束,當(dāng)為數(shù)據(jù)庫表中插入新記錄時(shí),字段上的值會(huì)自動(dòng)生成唯一的ID。在具體設(shè)置AUTO_INCREMENT約束時(shí),一個(gè)數(shù)據(jù)庫表中只能有一個(gè)字段使用該約束,該字段的數(shù)據(jù)類型必須是整數(shù)類型。由于設(shè)置AUTO_INCREMENT約束后的字段會(huì)生成唯一的ID,所以該字段也經(jīng)常會(huì)設(shè)置成PK主鍵。
5.2 特點(diǎn)
- 一個(gè)表最多只能有一個(gè)自增長列
- 當(dāng)需要產(chǎn)生唯一標(biāo)識(shí)符或者順序值時(shí),可設(shè)置自增長
- 自增長列約束的列必須是鍵列(主鍵列,唯一鍵列)
- 自增約束的列的數(shù)據(jù)類型必須是整數(shù)類型
- 如果自增列制定了0或NULL,會(huì)在當(dāng)前最大值的基礎(chǔ)上自增;如果自增列手動(dòng)指定了具體值,直接付志偉具體值。
5.3 指定自增約束
- 方法一:創(chuàng)建表是指定
CREATE TABLE table_name(
字段名 數(shù)據(jù)類型 PRIMARY KEY|UNIQUE AUTO_INCREMENT,
...
);
- 方法二:通過ALTER TABLE添加
ALTER TABLE <表名> MODIFY 字段名 數(shù)據(jù)類型 AUTO_INCREMENT;
5.4 刪除自增約束
ALTER TABLE <表名> MODIFY 字段名 數(shù)據(jù)類型;
TIPS:如下圖,刪除empno等于3的數(shù)據(jù),再插入一條數(shù)據(jù),empno不是3而是4
6. 總結(jié)贈(zèng)書:Python深度學(xué)習(xí)“四大名著”之一全新PyTorch版
????????????????
近年來,機(jī)器學(xué)習(xí)方法憑借其理解海量數(shù)據(jù)和自主決策的能力,已在醫(yī)療保健、 機(jī)器人、生物學(xué)、物理學(xué)、大眾消費(fèi)和互聯(lián)網(wǎng)服務(wù)等行業(yè)得到了廣泛的應(yīng)用。
《Python機(jī)器學(xué)習(xí):基于PyTorch和Scikit-Learn》這本書的定位是把機(jī)器學(xué)習(xí)理論和工程實(shí)踐結(jié)合起來,從而降低讀者的閱讀門檻。從數(shù)據(jù)驅(qū)動(dòng)方法的基礎(chǔ)知識(shí)到最新的深度學(xué)習(xí)框架,本書每一章都提供了機(jī)器學(xué)習(xí)代碼示例,用于解決實(shí)際應(yīng)用中的機(jī)器學(xué)習(xí)問題。
這是一本全面介紹在PyTorch環(huán)境下學(xué)習(xí)機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的綜合指南,可以作為初學(xué)者的入門教程,也可以作為讀者開發(fā)機(jī)器學(xué)習(xí)項(xiàng)目時(shí)的參考書。
深入介紹了機(jī)器學(xué)習(xí)方法的基礎(chǔ)知識(shí),不僅提供了構(gòu)建機(jī)器學(xué)習(xí)模型的說明,而且提供了構(gòu)建機(jī)器學(xué)習(xí)模型和解決實(shí)際問題的基本準(zhǔn)則。無論是機(jī)器學(xué)習(xí)入門新手,還是計(jì)劃跟蹤機(jī)器學(xué)習(xí)進(jìn)展的研發(fā)人員,都可以將本書作為使用Python進(jìn)行機(jī)器學(xué)習(xí)的不二之選。
感興趣的小伙伴可以自行閱讀購買
當(dāng)當(dāng)網(wǎng)購買鏈接:Python深度學(xué)習(xí)“四大名著”之一全新PyTorch版文章來源:http://www.zghlxwxcb.cn/news/detail-591673.html
??本次送書兩本,評(píng)論區(qū)抽兩位小伙伴送書??
活動(dòng)時(shí)間:截止到2023-07-22 20:00:00
抽獎(jiǎng)方式:利用程序進(jìn)行抽獎(jiǎng)。
參與方式:關(guān)注博主、點(diǎn)贊、收藏,評(píng)論區(qū)發(fā)布高質(zhì)量評(píng)論(單賬號(hào)最多評(píng)論三次)
中獎(jiǎng)名單:
溜達(dá)的大象
杭電碼農(nóng)-NEO文章來源地址http://www.zghlxwxcb.cn/news/detail-591673.html
到了這里,關(guān)于【?MySQL | 約束(一)】概念 | 非空 | 唯一 | 主鍵 | 自增長約束的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!