<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
約束就是,在建立表的時候,對錶設定一些規則,只有滿足這些規則,才可以插入資料,我們把這些規則叫做約束
常見的約束有:
約束型別 | 規則 |
---|---|
Not Null | 指定某列不能儲存NULL值 |
UNIQUE | 保證某列的每行必須有唯一的值 |
DEFAULT | 給沒有賦值的列賦預設值 |
PRIMARY KEY | Not NULL 與 UNIQUE的結合,一個表的特定記錄 |
FOREIGN KEY | 保證一個表匹配另一個表的值,遵守參照完整性 |
CHECK | 保證列符合指定條件 |
資料庫約束是資料庫的一個重要功能,資料的 “完整性”(正確的資料)可以通過人工的方式進行確定,但人工還是有一點的缺陷,約束,就是讓資料庫幫助我們更好的檢查資料是否正確
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) );
當我們加上約束時,可以發現id這一列不允許為空,我們試著插入一個為NULL的id試一下。
當我們插入的id為空時,系統會報id 這一列不能為空的錯誤。
當我們插入一個非NULL的資料時,可以成功插入。
在我們某些業務需要中某些列的資料不能夠重複,比如: 我們每個人的身份證號,大學生的學號,這些資料是唯一標識性的不能夠重複。
create table stu( id int unique, name varchar(50), sex char(3) );
這裡的UNI == unique.
我們試著插入一下資料看看。
我們可以發現再插入不同的id資料時是可以正常插入的,當我們再次插入已經出現過的id時,系統會報一個重複條目的錯誤。
一個小小的思考,資料庫是如何判斷你當前這一條記錄是否為重複的?
當然是先去查詢,然後再去插入。
有的同學肯定會說,加上約束之後,資料庫的執行速度不就大大的下降了,這裡的查詢是(藉助索引進行查詢的,效率相對比較高,後面我們會介紹索引的相關知識),執行效率確實受到了一定的影響,但比起手工去檢查,代價小的很多。
約束不僅可以單獨使用,而且可以多個組合起來對某一列進行約束。
比如同時加上: Not NULL 和 unique(這裡注意的是多個約束之間用空格間隔開,而不是逗號).
我們可以發現約束之間用逗號間隔會報錯。
我們可以發現當我們同時使用 Not NULL 和 unique約束時,出現了一個PRI,PRI == primary key,這是什麼我們往下看。
主鍵約束就是: not null + unique.
我們試著插入幾組資料。
我們可以發現主鍵列不能插入NULL型別的資料。
我們可以發現主鍵列插入不同的資料是OK的,如果插入相同的資料,就會報錯。
主鍵也同樣是在插入記錄的時候,先查詢,在插入:
正因為主鍵和unique都有先查詢的過程,mysql就會預設給這些列新增索引,提高查詢速度。
我們可以簡單來驗證一下,我們可以發現id列確實存在索引。
主鍵的注意事項:
1.在開發過程中,大部分的表都會存在一個主鍵,逐漸往往是一個整數型別的id.
2.在mysql中,一個表裡,只能存在一個主鍵,不能多個。
3.mysql允許將多個列共同作為一個主鍵(聯合主鍵)
4.mysql有自帶的"自增主鍵"(主鍵需要保證不重複,如果我們手動生成的話比較困難,這時我們就可以讓mysql自動幫我們生成。
-- 設定自增主鍵 create table stu(id int primary key auto_increment);
當我們將某一列設定為自增主鍵時,如果需要系統自動生成的話,我們插入null即可, 這裡的null不是說把這個值設定為Null,而是交給資料庫使用自增主鍵。
每一個插入資料時,mysql都會找到上一條記錄,自增。
我們也可以插入指定值。
我們可以發現,當我們指定值插入後,在使用自增主鍵,並不會去利用中間空餘的間隙,而是參照最大值進行自增。(這裡其實是我們很常見的一個用空間換取時間的行為).
如果mysql的資料量非常大時,自增主鍵還可以使用嗎?如果可以使用,又是如何分配呢?
當我們資料量較小時,所有的資料都在mysql伺服器當中儲存。
但是如果mysql的資料量很大時,一臺主機可能放不下,就需要進行分庫分表的操作。
當資料過多時,就需要分庫分表,實際上就是把一個大的表分為多個小的表,每個伺服器存取一部分資料。
這裡我們就分為三個伺服器進行儲存,每個伺服器的表佔各自的比例,三個伺服器中的主鍵值是不能重複的。
三個伺服器中的表的自增主鍵id是如何分配?
這裡涉及到"分散式系統唯一id生成演演算法"
大概公式是: 時間戳 + 主機編號 + 隨機因子 > 這三部分得到一個全域性唯一的id
在某些情況下,有些列的值大多數都是重複的,比如一個班的30個人,28個是男生,只有兩個女生,那麼我們就可以把性別列預設值設定為"男".
create table stu(id int primary key,name varchar(50),sex char(3) default '男');
我們可以看到性別這一列預設為男。
我們可以發現當我們沒有插入sex這一列,自動為預設值’男’.
外來鍵約束是建立在兩張表之間的約束。
比如每個班的同學的班級號都是一樣的,我們就可以用班級號來建立班級表和學生表之間的約束.
create table class(classId int primary key,name varchar(50));
我們先建立一個班級表,插入一組資料。
create table stu(id int primary key,name varchar(50),classId int,foreign key(classId) references class(classId));
這個是外來鍵約束的語法。
外來鍵約束的含義時,stu表中的classId必須在class表中是存在的。
當我們插入class存在的classid為001的資料可以成功插入。
當我們插入的classId在class中不存在時,就會插入失敗。
此處起到約束的class表是"父表(parent)",被約束的表叫做"子表(child).
實則不然,我們子表對父表也產生了一定的約束。
我們可以發現,無法刪除外來鍵約束的父表。
這也很好理解,如果父表刪除了,子表的資料去哪裡參考,如果想刪除,可以先刪除子表,在刪除父表。
我們可以發現當父表相應列不是主鍵時,無法建立外來鍵約束,這是為什麼呢?
因為每次再給子表插入時,都會先在父表先查詢這個id是否存在,如果表的資料十分大時,效率十分地低,要使用索引。
要想建立外來鍵,就要求父類別相應的列,有primary 或者 unique約束
到此這篇關於MySQL資料庫約束操作範例講解的文章就介紹到這了,更多相關MySQL資料庫約束內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45