MySQL數(shù)據(jù)庫約束操作示例講解
一、約束是什么
約束就是,在創(chuàng)建表的時候,對表設置一些規(guī)則,只有滿足這些規(guī)則,才可以插入數(shù)據(jù),我們把這些規(guī)則叫做約束
常見的約束有:
約束類型 | 規(guī)則 |
---|---|
Not Null | 指定某列不能存儲NULL值 |
UNIQUE | 保證某列的每行必須有唯一的值 |
DEFAULT | 給沒有賦值的列賦默認值 |
PRIMARY KEY | Not NULL 與 UNIQUE的結合,一個表的特定記錄 |
FOREIGN KEY | 保證一個表匹配另一個表的值,遵守參照完整性 |
CHECK | 保證列符合指定條件 |
數(shù)據(jù)庫約束是數(shù)據(jù)庫的一個重要功能,數(shù)據(jù)的 “完整性”(正確的數(shù)據(jù))可以通過人工的方式進行確定,但人工還是有一點的缺陷,約束,就是讓數(shù)據(jù)庫幫助我們更好的檢查數(shù)據(jù)是否正確
二、約束的具體操作
Not NULL
create table stu( id int, name varchar(50), sex char(3) );
當我們建一個表時,是允許為NULL的,如果我們不允許這一列為空時,我們就需要加上Not NULL約束。
create table stu( id int not null, name varchar(50), sex char(3) );
當我們加上約束時,可以發(fā)現(xiàn)id這一列不允許為空,我們試著插入一個為NULL的id試一下。
當我們插入的id為空時,系統(tǒng)會報id 這一列不能為空的錯誤。
當我們插入一個非NULL的數(shù)據(jù)時,可以成功插入。
UNIQUE
在我們某些業(yè)務需要中某些列的數(shù)據(jù)不能夠重復,比如: 我們每個人的身份證號,大學生的學號,這些數(shù)據(jù)是唯一標識性的不能夠重復。
create table stu( id int unique, name varchar(50), sex char(3) );
這里的UNI == unique.
我們試著插入一下數(shù)據(jù)看看。
我們可以發(fā)現(xiàn)再插入不同的id數(shù)據(jù)時是可以正常插入的,當我們再次插入已經(jīng)出現(xiàn)過的id時,系統(tǒng)會報一個重復條目的錯誤。
一個小小的思考,數(shù)據(jù)庫是如何判斷你當前這一條記錄是否為重復的?
當然是先去查找,然后再去插入。
有的同學肯定會說,加上約束之后,數(shù)據(jù)庫的執(zhí)行速度不就大大的下降了,這里的查找是(借助索引進行查找的,效率相對比較高,后面我們會介紹索引的相關知識),執(zhí)行效率確實受到了一定的影響,但比起手工去檢查,代價小的很多。
約束的組合使用
約束不僅可以單獨使用,而且可以多個組合起來對某一列進行約束。
比如同時加上: Not NULL 和 unique(這里注意的是多個約束之間用空格間隔開,而不是逗號).
我們可以發(fā)現(xiàn)約束之間用逗號間隔會報錯。
我們可以發(fā)現(xiàn)當我們同時使用 Not NULL 和 unique約束時,出現(xiàn)了一個PRI,PRI == primary key,這是什么我們往下看。
PRIMARY KEY
主鍵約束就是: not null + unique.
我們試著插入幾組數(shù)據(jù)。
我們可以發(fā)現(xiàn)主鍵列不能插入NULL類型的數(shù)據(jù)。
我們可以發(fā)現(xiàn)主鍵列插入不同的數(shù)據(jù)是OK的,如果插入相同的數(shù)據(jù),就會報錯。
主鍵也同樣是在插入記錄的時候,先查詢,在插入:
正因為主鍵和unique都有先查詢的過程,mysql就會默認給這些列添加索引,提高查詢速度。
我們可以簡單來驗證一下,我們可以發(fā)現(xiàn)id列確實存在索引。
主鍵的注意事項:
1.在開發(fā)過程中,大部分的表都會存在一個主鍵,逐漸往往是一個整數(shù)類型的id.
2.在mysql中,一個表里,只能存在一個主鍵,不能多個。
3.mysql允許將多個列共同作為一個主鍵(聯(lián)合主鍵)
4.mysql有自帶的"自增主鍵"(主鍵需要保證不重復,如果我們手動生成的話比較困難,這時我們就可以讓mysql自動幫我們生成。
-- 設置自增主鍵 create table stu(id int primary key auto_increment);
當我們將某一列設置為自增主鍵時,如果需要系統(tǒng)自動生成的話,我們插入null即可, 這里的null不是說把這個值設置為Null,而是交給數(shù)據(jù)庫使用自增主鍵。
每一個插入數(shù)據(jù)時,mysql都會找到上一條記錄,自增。
我們也可以插入指定值。
我們可以發(fā)現(xiàn),當我們指定值插入后,在使用自增主鍵,并不會去利用中間空余的間隙,而是參照最大值進行自增。(這里其實是我們很常見的一個用空間換取時間的行為).
如果mysql的數(shù)據(jù)量非常大時,自增主鍵還可以使用嗎?如果可以使用,又是如何分配呢?
當我們數(shù)據(jù)量較小時,所有的數(shù)據(jù)都在mysql服務器當中存儲。
但是如果mysql的數(shù)據(jù)量很大時,一臺主機可能放不下,就需要進行分庫分表的操作。
當數(shù)據(jù)過多時,就需要分庫分表,實際上就是把一個大的表分為多個小的表,每個服務器存取一部分數(shù)據(jù)。
這里我們就分為三個服務器進行存儲,每個服務器的表占各自的比例,三個服務器中的主鍵值是不能重復的。
三個服務器中的表的自增主鍵id是如何分配?
這里涉及到"分布式系統(tǒng)唯一id生成算法"
大概公式是: 時間戳 + 主機編號 + 隨機因子 > 這三部分得到一個全局唯一的id
DEFAULT
在某些情況下,有些列的值大多數(shù)都是重復的,比如一個班的30個人,28個是男生,只有兩個女生,那么我們就可以把性別列默認值設置為"男".
create table stu(id int primary key,name varchar(50),sex char(3) default '男');
我們可以看到性別這一列默認為男。
我們可以發(fā)現(xiàn)當我們沒有插入sex這一列,自動為默認值’男’.
FOREIGN KEY
外鍵約束是建立在兩張表之間的約束。
比如每個班的同學的班級號都是一樣的,我們就可以用班級號來建立班級表和學生表之間的約束.
create table class(classId int primary key,name varchar(50));
我們先創(chuàng)建一個班級表,插入一組數(shù)據(jù)。
create table stu(id int primary key,name varchar(50),classId int,foreign key(classId) references class(classId));
這個是外鍵約束的語法。
外鍵約束的含義時,stu表中的classId必須在class表中是存在的。
當我們插入class存在的classid為001的數(shù)據(jù)可以成功插入。
當我們插入的classId在class中不存在時,就會插入失敗。
此處起到約束的class表是"父表(parent)",被約束的表叫做"子表(child).
實則不然,我們子表對父表也產(chǎn)生了一定的約束。
我們可以發(fā)現(xiàn),無法刪除外鍵約束的父表。
這也很好理解,如果父表刪除了,子表的數(shù)據(jù)去哪里參考,如果想刪除,可以先刪除子表,在刪除父表。
我們可以發(fā)現(xiàn)當父表相應列不是主鍵時,無法建立外鍵約束,這是為什么呢?
因為每次再給子表插入時,都會先在父表先查詢這個id是否存在,如果表的數(shù)據(jù)十分大時,效率十分地低,要使用索引。
要想創(chuàng)建外鍵,就要求父類相應的列,有primary 或者 unique約束
到此這篇關于MySQL數(shù)據(jù)庫約束操作示例講解的文章就介紹到這了,更多相關MySQL數(shù)據(jù)庫約束內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- 淺談關系型數(shù)據(jù)庫中的約束及應用場景
- MySQL數(shù)據(jù)庫表中的約束詳解
- MySQL數(shù)據(jù)庫的約束使用實例
- 一文理解MySQL數(shù)據(jù)庫的約束與表的設計
- SQL?Server數(shù)據(jù)庫創(chuàng)建表及其約束條件的操作方法
- MySQL數(shù)據(jù)庫的約束限制詳解
- MySQL數(shù)據(jù)庫表約束講解
- MySQL示例講解數(shù)據(jù)庫約束以及表的設計
- MySQL數(shù)據(jù)庫如何給表設置約束詳解
- MySQL?數(shù)據(jù)庫的約束及數(shù)據(jù)表的設計原理
- Mysql關于數(shù)據(jù)庫是否應該使用外鍵約束詳解說明
- 深入理解數(shù)據(jù)庫之表的唯一、自增等七大約束
相關文章
MySQL無法讀表錯誤的解決方法(MySQL 1018 error)
這篇文章主要為大家詳細介紹了MySQL無法讀表錯誤的解決方法,MySQL 1018 error如何解決?具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01設置MySQLroot賬戶密碼報錯ERROR 1064 (42000): You 
在安裝mysql的時候,設置root賬戶密碼出現(xiàn)了ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds..錯誤,本文小編給大家介紹了相關的解決方案,需要的朋友可以參考下2023-12-12