MySQL篇四:表的約束

文章目錄

  • 前言
  • 1. 空屬性
  • 2. 默認值
  • 3. 列描述
  • 4. zerofill
  • 5. 主鍵
  • 6. 自增長
  • 7. 唯一鍵
  • 8. 外鍵

前言

??真正約束字段的是數據類型,但是數據類型約束很單一,需要有一些額外的約束,更好的保證數據的合法性,從業務邏輯角度保證數據的正確性。比如有一個字段是email,要求是唯一的。
??表的約束很多,這里主要介紹如下幾個: null/not null,default,comment,zerofill,primary key,auto_increment,unique key 。
??約束的本質是通過技術手段,倒逼程序員加入正確的數據。反過來站在MySQL的視角,凡是插入進來的數據,都是符合數據約束的。約束的最終目標:保證數據的完整性和預期性。

1. 空屬性

  • 兩個值:null(默認的)和not null(不為空)
  • 數據庫默認字段基本都是字段為空,但是實際開發時,盡可能保證字段不為空,因為數據為空沒辦法參與運算。

??實例:
在這里插入圖片描述

2. 默認值

??默認值:某一種數據會經常性的出現某個具體的值,可以在一開始就指定好,在需要真實數據的時候,用戶可以選擇性的使用默認值。
??默認值的生效:數據在插入的時候不給該字段賦值,就使用默認值。
在這里插入圖片描述

3. 列描述

??列描述:comment,沒有實際含義,專門用來描述字段,會根據表創建語句保存,用來給程序員或DBA來進行了解。
??列描述同desc是看不到的,但是可以通過show create table 表名 \G 查看。

4. zerofill

??剛開始學習數據庫時,很多人對數字類型后面的長度很迷茫。通過show看看tt3表的建表語句:
在這里插入圖片描述
??可以看到int(10),這個代表什么意思呢?整型不是4字節碼?這個10又代表什么呢?其實沒有zerofill這個屬性,括號內的數字是毫無意義的。a和b列就是前面插入的數據,如下:

mysql> insert into tt3 values(1,2);
Query OK, 1 row affected (0.00 sec)
mysql> select * from tt3;
+------+------+
| a | b |
+------+------+
| 1 | 2 |
+------+------+

??但是對列添加了zerofill屬性后,顯示的結果就有所不同了。修改tt3表的屬性:

mysql> alter table tt3 change a a int(5) unsigned zerofill;

??對a列添加了zerofill屬性,再進行查找,返回如下結果:

mysql> select * from tt3;
+-------+------+
| a | b |
+-------+------+
| 00001 | 2 |
+-------+------+

??這次可以看到a的值由原來的1變成00001,這就是zerofill屬性的作用,如果寬度小于設定的寬度(這里設置的是5),自動填充0。要注意的是,這只是最后顯示的結果,在MySQL中實際存儲的還是1。為什么是這樣呢?我們可以用hex函數來證明。

mysql> select a, hex(a) from tt3;
+-------+--------+
| a | hex(a) |
+-------+--------+
| 00001 | 1 |
+-------+--------+

??可以看出數據庫內部存儲的還是1,00001只是設置了zerofill屬性后的一種格式化輸出而已。
??zerofill的作用就是將數據設置成等寬的長度,不夠的會在前面補零。

alter table 表名 modify a int(5) unsigned zerofill;

??括號中的寬度可以自己隨意設置。

5. 主鍵

??主鍵:primary key用來唯一的約束該字段里面的數據,不能重復,不能為空,一張表中最多只能有一個主鍵;主鍵所在的列通常是整數類型。
在這里插入圖片描述

  • 主鍵約束:主鍵對應的字段中不能重復,一旦重復,操作失敗。
    在這里插入圖片描述

  • 當表創建好以后但是沒有主鍵的時候,可以再次追加主鍵

alter table 表名 add primary key(字段列表)
  • 刪除主鍵:
alter table 表名 drop primary key;delete from 表名 where 屬性=具體值;  --- 刪除表中的某一個數據
  • 復合主鍵
    ??在創建表的時候,在所有字段之后,使用primary key(主鍵字段列表)來創建主鍵,如果有多個字段作為主鍵,可以使用復合主鍵。
    在這里插入圖片描述
    ??對于復合主鍵,比如下面的例子,對于插入的數據,課程號是可以一樣的,在這里看主鍵時需要將id和course一起看,只有當兩個數據同時其他數據重復時才會報錯(比如,插入了id=1和course=1,然后又插入了id=1和course=1就會報錯,如果插入的是id=1和course=2,是不會報錯的。)

6. 自增長

??auto_increment:當對應的字段,不給值,會自動的被系統觸發,系統會從當前字段中已經有的最大值+1操作,得到一個新的不同的值。通常和主鍵搭配使用,作為邏輯主鍵。
??自增長的特點:

  • 任何一個字段要做自增長,前提是本身是一個索引(key一欄有值)
  • 自增長字段必須是整數
  • 一張表最多只能有一個自增長

在這里插入圖片描述
??它會選取最大的值進行遞增。
在這里插入圖片描述
??自增長也可以在創建表的時候進行設置:

create table 表名(id int,name varchar(20)
)auto_increment=100;

??在插入后獲取上次插入的 AUTO_INCREMENT 的值(批量插入獲取的是第一個值):

mysql > select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 1 |
+------------------+

??索引:
??在關系數據庫中,索引是一種單獨的、物理的對數據庫表中一列或多列的值進行排序的一種存儲結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。索引的作用相當于圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。
??索引提供指向存儲在表的指定列中的數據值的指針,然后根據您指定的排序順序對這些指針排序。數據庫使用索引以找到特定值,然后順指針找到包含該值的行。這樣可以使對應于表的SQL語句執行得更快,可快速訪問數據庫表中的特定信息。

7. 唯一鍵

??一張表中有往往有很多字段需要唯一性,數據不能重復,但是一張表中只能有一個主鍵:唯一鍵就可以解決表中有多個字段需要唯一性約束的問題。
??唯一鍵的本質和主鍵差不多,唯一鍵允許為空,而且可以多個為空,空字段不做唯一性比較。
??關于唯一鍵和主鍵的區別:
??我們可以簡單理解成,主鍵更多的是標識唯一性的。而唯一鍵更多的是保證在業務上,不要和別的信息出現重復。乍一聽好像沒啥區別,我們舉一個例子:

??假設一個場景(當然,具體可能并不是這樣,僅僅為了幫助大家理解)
??比如在公司,我們需要一個員工管理系統,系統中有一個員工表,員工表中有兩列信息,一個身份證號碼,一個是員工工號,我們可以選擇身份號碼作為主鍵。
??而我們設計員工工號的時候,需要一種約束:而所有的員工工號都不能重復。
具體指的是在公司的業務上不能重復,我們設計表的時候,需要這個約束,那么就可以將員工工號設計成為唯一鍵。
??一般而言,我們建議將主鍵設計成為和當前業務無關的字段,這樣,當業務調整的時候,我們可以盡量不會對主鍵做過大的調整。

??主鍵不能為空,唯一鍵可以為空,空字段不做唯一性比較。

8. 外鍵

??外鍵用于定義主表和從表之間的關系:外鍵約束主要定義在從表上,主表則必須是有主鍵約束或unique約束。當定義外鍵后,要求外鍵列數據必須在主表的主鍵列存在或為null。
??語法:

foreign key (字段名) references 主表()

??案例:
在這里插入圖片描述
在這里插入圖片描述
??創建班級:
在這里插入圖片描述
??向學生表中插入對應班級的學生:
在這里插入圖片描述
??我們并沒有創建班級號 id 為3的班級,當我們插入一個班級id為3的學生時,就會報錯,這就是外鍵的作用。如果我們沒有設置外鍵,那么對于學生表就可以隨意插入,即使班級號不存在,我們也可以插入。
??當沒有外鍵時,就可以將它們看成兩個單獨的表,插入一些非法數據,比如插入一個班級不存在的學生,也是可以成功的。但是加入外鍵時,就必須遵守一些約束了。

??如何理解外鍵約束:

??首先我們承認,這個世界是數據很多都是相關性的。
??理論上,上面的例子,我們不創建外鍵約束,就正常建立學生表,以及班級表,該有的字段我們都有。
??此時,在實際使用的時候,可能會出現什么問題?
??有沒有可能插入的學生信息中有具體的班級,但是該班級卻沒有在班級表中?
??因為此時兩張表在業務上是有相關性的,但是在業務上沒有建立約束關系,那么就可能出現問題。
??解決方案就是通過外鍵完成的。建立外鍵的本質其實就是把相關性交給mysql去審核了,提前告訴mysql表之間的約束關系,那么當用戶插入不符合業務邏輯的數據的時候,mysql不允許你插入。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42967.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42967.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42967.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JAVA學習筆記-JAVA基礎語法-DAY24-Stream流、方法引用

第一章 Stream流 說到Stream便容易想到I/O Stream,而實際上,誰規定“流”就一定是“IO流”呢?在Java 8中,得益于Lambda所帶來的函數式編程,引入了一個全新的Stream概念,用于解決已有集合類庫既有的弊端。 …

python 高級技巧 0708

python 33個高級用法技巧 使用裝飾器計時函數 裝飾器是一種允許在一個函數或方法調用前后運行額外代碼的結構。 import timedef timer(func):"""裝飾器函數,用于計算函數執行時間并打印。參數:func (function): 被裝飾的函數返回:function: 包裝后…

軟件架構之開發方法

軟件架構之開發方法 第6章:開發方法6.1 軟件生命周期6.2 軟件開發模型6.2.1 瀑布模型6.2.2 演化模型6.2.3 螺旋模型6.2.4 增量模型6.2.5 構件組裝模型 6.3 統一過程6.4 敏捷方法6.4.1 極限編程6.4.2 特征驅動開發6.4.3 Scrum6.4.4 水晶方法6.4.5 其他敏捷方法 6.5 軟…

vmware lun回收引起的IO問題

起初并沒人關注的小問題,正常不過的虛機存儲遷移操作,引起的延遲卻引發一連串的變化。 環境 vsphere 6.7 + 華為集中式存儲 開始 下午5:17 業務反饋,存在數據超時,頻繁在1秒鐘以內,正常在200ms。需運維排查虛機的狀態與IO情況等硬件使用情況。下午5:30 隨手翻開zabbix 打開…

vue在線預覽excel、pdf、word文件

安裝 //docx文檔預覽組件 npm install vue-office/docx vue-demi//excel文檔預覽組件 npm install vue-office/excel vue-demi//pdf文檔預覽組件 npm install vue-office/pdf vue-demi使用示例 docx文檔的預覽 <template><vue-office-docx :src"src" ren…

【嵌入式Linux】<知識點> 虛擬地址空間

前言 在Linux中&#xff0c;新創建的進程都擁有獨立的虛擬地址空間。為深入多進程多線程的理解&#xff0c;了解虛擬地址空間分區十分有必要。 一、概念 虛擬地址空間分為4G空間&#xff0c;其中1G為內核區&#xff0c;3G為用戶區。虛擬地址空間的地址從0開始&#xff0c;且該…

20240708 視覺大模型

參考網站&#xff1a; 萬字長文帶你全面解讀視覺大模型 - 知乎 一.DINO 1."YOLO"&#xff08;You Only Look Once&#xff09;和"DINO"&#xff08;DIstillation of knowledge&#xff09;是兩種不同的模型&#xff0c;針對不同的任務和學習目標。以下是…

oracle數據庫表統計信息

oracle數據庫表統計信息未及時更新會導致oracle基于成本的執行計劃可能不是最優&#xff0c;查看執行計劃是沒問題的&#xff0c;但sql實際執行起來確很慢。 查詢oracle數據庫表統計信息最后更新時間&#xff1a; SELECT TABLE_NAME, LAST_ANALYZED,a.* FROM ALL_TAB_STATISTI…

66.Python-web框架-Django-免費模板django-datta-able的分頁的一種方式

目錄 1.方案介紹 1.1實現效果 1.2django.core.paginator Paginator 類: Page 類: EmptyPage 和 PageNotAnInteger 異常: 1.3 templatetags 2.方案步驟 2.1創建一個common app 2.2創建plugins/_pagination.html 2.3 其他app的views.py查詢方法 2.4在AIRecords.html里…

入門 Vue Router

Vue Router Vue Router插件做了什么&#xff1f; 全局注冊 RouterView 和 RouterLink 組件。添加全局 $router 和 $route 屬性。啟用 useRouter() 和 useRoute() 組合式函數。觸發路由器解析初始路由。 標簽介紹 RouterView 加載指定頁面 <RouterLink to"/home"…

必剪APP視頻剪輯的字幕制作方法教程!

你是否還在用pr聽一句打一句的制作字幕&#xff1f;你是否還在用ps做字幕然后拉到pr里一句一句的對時間軸&#xff1f;快別用那些老方法啦&#xff0c;繁瑣又浪費時間&#xff01;今天給大家推薦一個方便速度的制作字幕的方法&#xff0c;趕快來看看吧&#xff01; 第一步&…

【Altium】AD-網絡版一個用戶非人為異常占用多個License的解決方法

【更多軟件使用問題請點擊億道電子官方網站】 1、 文檔目標 當出現一個用戶同時占用多個授權&#xff0c;又無法單獨釋放一個授權的情況下&#xff0c;該如何解決。 2、 問題場景 一個用戶獲取網絡版授權后&#xff0c;AD會自動重復獲取授權&#xff0c;直到該license下所有授…

電視盒子變身NAS之安裝termux

此方法適合安卓4.4到安卓9.0都可以用&#xff0c;我目前測試的設備是安卓9.0的電視盒子 第一步&#xff1a;下載安裝termux https://termux.dev/en/ 或者 https://github.com/termux/termux-app/releases 第二步&#xff1a;把apk安裝到你的機頂盒&#xff0c;使用優盤&…

讀書記錄《SQL從小白到大牛》01

讀書記錄《SQL從小白到大牛》01 接地氣的書名&#xff0c;內容應當值得一讀。 第一篇 SQL基礎 01 一些基礎概念 SQL是結構化查詢語言&#xff08;Structured Query Language&#xff09;&#xff0c;是一套用來輸入、更改和查看關系數據庫內容的命令。數據庫發展經歷三個階…

Python自動化與系統安全

信息安全是運維的根本&#xff0c;直接關系到企業的安危&#xff0c;稍有不慎會造成災難性的后果。比如經年發生的多個知名網站會員數據庫外泄事件&#xff0c;信息安全體系建設已經被提到了前所未有的高度。如何提升企業的安全防范水準是目前普遍面臨的問題&#xff0c;主要有…

Swagger的原理及應用詳解(四)

本系列文章簡介: 在當今快速發展的軟件開發領域,特別是隨著微服務架構和前后端分離開發模式的普及,API(Application Programming Interface,應用程序編程接口)的設計與管理變得愈發重要。一個清晰、準確且易于理解的API文檔不僅能夠提升開發效率,還能促進前后端開發者之…

Greenplum(一)【MPP 架構 數據類型】

1、Greenplum 入門 Greenplum 是基于 MPP 架構的一款分布式分析型數據庫&#xff0c;具備關系型數據庫的特點&#xff0c;因為它處理的是結構化的數據&#xff0c;同時具備大數據分布式的特點。 1.1、MPP 架構 MPP&#xff08;Massively Parallel Processing&#xff09;架構是…

從Java開發者到.NET Core初級工程師學習路線:目錄

C#語言基礎 1.1 C#語法概覽 1.2 變量和數據類型 1.3 運算符和表達式 1.4 控制流語句 1.5 方法和參數 1.6 類和對象 1.7 繼承和多態 1.8 接口和抽象類 1.9 委托和事件 1.10 泛型 1.11 LINQ (Language Integrated Query) 1.12 異步編程 (async/await) 1.13 異常處理 1.14 文件I/O…

IOC、DI<3> IServiceConllection 自定義IOC含屬性注入、多實現注入,方法注入

using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks;namespace IOC.Common {public class ZenServiceCollection : IZenServiceCollection{// 記錄IOC注冊的抽象、實現private Di…

SpringSecurity初始化過程

SpringSecurity初始化過程 SpringSecurity一定是被Spring加載的&#xff1a; web.xml中通過ContextLoaderListener監聽器實現初始化 <!-- 初始化web容器--><!--設置配置文件的路徑--><context-param><param-name>contextConfigLocation</param-…