MySQL-表的約束(上)

表的約束

? ? ? ? 在 MySQL 中,表的約束(Constraints)用于確保數據庫中數據的完整性和一致性。它們定義了對表中數據的規則和限制,防止無效或不一致的數據被插入、更新或刪除。常見的 MySQL 表約束包括主鍵約束(PRIMARY KEY)外鍵約束(FOREIGN KEY)唯一約束(UNIQUE)非空約束(NOT NULL)檢查約束(CHECK)默認約束(DEFAULT)自增約束(AUTO_INCREMENT)等,這些約束可以在創建表時定義,也可以使用?ALTER TABLE?語句在已存在的表上添加或修改。合理使用約束可以大大提高數據庫中數據的質量和可靠性。

? ? ? ? 但事實上真正約束字段的是數據類型,但是數據類型約束很單一,需要有一些額外的約束,更好的保證數據的合 法性,從業務邏輯角度保證數據的正確性。 表的約束很多,這里主要介紹如下幾個: null/not null,default, comment, zerofill,primary key,auto_increment,unique key

空屬性

? ? ? ? 在 MySQL 中,空屬性(NULL/NOT NULL)?是最基礎也最常用的表約束之一,用于控制列是否允許存儲?NULL?值(表示 "無值" 或 "未知值")。

  • NULL:表示列允許存儲空值(默認行為)
  • NOT NULL:強制列必須存儲具體值,不允許為空

注意:數據庫默認字段基本都是字段為空,但是實際開發時,盡可能保證字段不為空,因為數據為空沒辦 法參與運算。

如圖所示

案例:

? ? ? ? 創建一個班級表,包含班級名和班級所在的教室。

? ? ? ? 站在正常的業務邏輯中: 如果班級沒有名字,你不知道你在哪個班級 如果教室名字可以為空,就不知道在哪上課 。

? ? ? ? 所以我們在設計數據庫表的時候,一定要在表中進行限制,滿足上面條件的數據就不能插入到表中。這 就是“約束”



如圖所示

? ? ? ? 我們創建一個名為“myclass”的表來測試一下。

? ? ? ? 然后,查看一下表的數據結構

? ? ? ? 可以看到,我們在創建數據表的時候,定義了字段“class-name”和“class-room”not null,以及字段“other” null然后我們來測試一下這兩個字段是否允許 null

? ? ? ? 插入幾組數據來做測試。

? ? ? ? 通過測試可以發現字段“other”是允許為 null 的,而字段“class-name”和“class-room”是不允許為 null 的



默認值

? ? ? ? 在 MySQL 中,默認值約束(DEFAULT)?用于為表中的列指定一個默認值。當向表中插入數據時,如果沒有為該列提供具體值,MySQL 會自動使用默認值填充。



? ? ? ? 我們創建一個名為“t13”的表來測試一下。

? ? ? ??查看一下表的數據結構

? ? ? ? 插入幾組數據來測試一下。

? ? ? ?查看一下插入的數據。

? ? ? ?我們這時插入數據是正常插入的。

? ? ? ?假設我們只插入name這一列。

? ? ? ? 可以看出,這時其余兩項是默認插入的,并不是用戶主動插入的

? ? ? ? 我們創建一個表再來看一下。

? ? ? ? 查看一下這張表的數據結構。

? ?我們可以看到Default列是默認值。如果插入數據時沒有指定該列的值,會使用默認值。name?的默認值是?NULL,但由于?name?不允許為?NULL,所以插入時必須顯式指定?name?的值。age?的默認值是?18gender?的默認值是?男。

? ? ? ? 我們不妨忽略gender和age試試。

? ? ? ? 可以看出,我們所忽略的值都是被默認插入了。



注意:

  1. 與 NOT NULL 結合:默認值通常與?NOT NULL?一起使用,確保列既有默認值又不允許為空

    sql

  2. 函數作為默認值:MySQL 支持使用某些函數作為默認值。

  3. 插入時覆蓋默認值:如果插入數據時指定了具體值,將覆蓋默認值

列描述

? ? ? ? 在 MySQL 中,“列描述” 并不是一種約束,而是用于對表中的列進行說明、注釋,方便其他開發者或自己后續了解列的含義等信息。可以通過?COMMENT?關鍵字來為列添加描述信息。



? ? ? ? 這部分我們就來簡單了解一下。

? ? ? ? 創建一個表來進行測試并查看一下表結構。

? ? ? ? 插入幾組數據。

? ? ? ? 解釋一下,列描述:comment,沒有實際含義,專門用來描述字段,會根據表創建語句保存,用來給程序員或DBA 來進行了解。



zerofill

? ? ? ? 在 MySQL 中ZEROFILL?是一種針對數值類型列的特殊約束(更準確地說是一種格式屬性),用于在數值的顯示長度不足時,自動在前面補零(0)。

  • 僅影響數值的顯示形式,不改變數據的實際存儲值
  • 自動為列隱式添加?UNSIGNED?屬性(無符號,即只能存儲非負數值)


如圖所示

? ? ? ? 創建一個表,并查看一下它的表結構。

? ? ? ? ?可以看到int(10),這個代表什么意思呢?整型不是4字節碼?這個10又代表什么呢?其實沒有zerofill這個 屬性,括號內的數字是毫無意義的。

? ? ? ? 現在我們來插入幾組數據。

? ? ? ? 接著修改一下它的數據結構。

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

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

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

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

相關文章

Frida + FART 聯手:解鎖更強大的 Android 脫殼新姿勢

版權歸作者所有,如有轉發,請注明文章出處:https://cyrus-studio.github.io/blog/ Frida FART 聯手能帶來什么提升? 增強 FART 的脫殼能力:解決對抗 FART 的殼、動態加載的 dex 的 dump 和修復; 控制 FART…

TLS/SSL(傳輸層安全協議)

文章目錄一、核心概念二、為什么需要 TLS/SSL?三、工作原理與詳細流程握手步驟詳解:1.ClientHello & ServerHello:2.服務器認證 (Certificate, ServerKeyExchange):3.客戶端響應 (ClientKeyExchange, Finished):4.…

什么是 AWS 和 GCE ?

AWS 和 GCE 是兩種不同廠商提供的云計算服務,主要區別在于提供商和產品定位。AWS全稱:Amazon Web Services提供商:亞馬遜 (Amazon)簡介:全球最大的云計算平臺之一,提供完整的云服務,包括: 計算&…

水電站電動機絕緣安全 “不掉線”!在線監測方案筑牢發電保障

對水電站而言,消防水泵、深井水泵等輔助電動機是安全運行的 “關鍵配角”—— 它們常年處于備用狀態,又受潮濕環境影響,絕緣值降低易引發燒毀故障,而傳統定期檢測難以及時捕捉絕緣劣化趨勢,一旦啟動時出問題&#xff0…

【Datawhale之Happy-LLM】3種常見的decoder-only模型——Github最火大模型原理與實踐教程task07

Task07:第三章 預訓練語言模型PLM (這是筆者自己的學習記錄,僅供參考,原始學習鏈接,愿 LLM 越來越好?) 本篇介紹3種很典的decoder-only的PLM(GPT、LlaMA、GLM)。目前火&#x1f52…

【卷積神經網絡】卷積神經網絡的三大核心優勢:稀疏交互、參數共享與等變表示

1. 引言 卷積神經網絡(CNN)之所以在計算機視覺、語音識別等領域取得突破性進展,并非偶然。相比傳統的全連接神經網絡,CNN通過三個重要的思想來幫助改進機器學習系統:稀疏交互(sparse interactions)、參數共享(parameter sharing)、等變表示(equivariant representations)。…

網絡共享協議

網絡共享協議是用于在計算機網絡中實現資源共享和數據傳輸的規則或標準。常見的共享協議包括文件共享、打印機共享、互聯網連接共享等。SMB(Server Message Block 服務器消息塊)SMB是一種網絡共享協議,主要用于局域網中實現不同設備之間的文件…

MD5加密算法詳解與實現

MD5加密算法詳解與實現 什么是MD5加密? MD5(Message-Digest Algorithm 5)是一種廣泛使用的密碼散列函數,可以產生一個128位(16字節)的哈希值,通常用32位的十六進制數表示。MD5由Ronald Rivest在…

(nice!!!)(LeetCode 每日一題) 3025. 人員站位的方案數 I (排序)

題目:3025. 人員站位的方案數 I 思路:排序,時間復雜度0(n^2)。 將數組points里的元素先按橫坐標x升序排序,縱坐標y降序排序。第一層for循環枚舉左上角的點,第二層for循環枚舉右下角的點。細節看注釋。 C版本&#xff…

可可圖片編輯 HarmonyOS(4)圖片裁剪

可可圖片編輯 HarmonyOS(4)圖片裁剪-canvas 前言 可可圖片編輯 實現了圖片的裁剪功能,效果如圖所示。這里的核心技術是使用了canvas。 Canvas 入門 Canvas提供畫布組件,用于自定義繪制圖形,開發者使用CanvasRenderi…

怎么用PS制作1寸證件照(已解決)

方法/步驟一、按住鍵盤上的“Ctrl”“O”打開你要制作的照片二、點擊裁剪工具 (調整為寬:2.5cm,高:3.5cm,分辨率:300像素),設置之后直接框選出需要剪切保留的位置(使人物居正中), 然后按上面的“√”,以便確認剪裁三、…

Qt libcurl的下載、配置及簡單測試 (windows環境)

Qt libcurl的下載、配置及簡單測試引言一、libcurl下載二、在Qt Creator中配置三、簡單測試引言 curl(Client URL)是一個開源的命令行工具和庫,用于傳輸數據支持多種協議(如HTTP、HTTPS、FTP、SFTP等)。其核心庫libcur…

【Python語法基礎學習筆記】競賽常用標準庫

前言此系列筆記是撥珠自己的學習筆記,自用為主,學習建議移步其他大佬的專門教程。math庫Python 的 math 庫是標準庫之一,提供了大量數學運算相關的函數,適用于基礎數學計算、科學計算等場景。下面詳細介紹其使用方法及常用功能&am…

我的項目我做主:Focalboard+cpolar讓團隊協作擺脫平臺依賴

文章目錄前言1. 使用Docker本地部署Focalboard1.1 在Windows中安裝 Docker1.2 使用Docker部署Focalboard2. 安裝Cpolar內網穿透工具3. 實現公網訪問Focalboard4. 固定Focalboard公網地址前言 “項目管理軟件又漲價了!“小團隊負責人小林發愁——剛習慣操作邏輯&…

【3D 入門-4】trimesh 極速上手之 3D Mesh 數據結構解析(Vertices / Faces)

【3D入門-指標篇上】3D 網格重建評估指標詳解與通俗比喻【3D入門-指標篇下】 3D重建評估指標對比-附實現代碼【3D 入門-3】常見 3D 格式對比,.glb / .obj / .stl / .ply Mesh 數據結構解析 1. Vertices(頂點) original_vertices mesh_ful…

無需服務器,免費、快捷的一鍵部署前端 vue React代碼--PinMe

作為前端的開發,有時候想部署一個項目真的是很“受氣”,要不就是找運維,或者后端,看別人的時間,或者走流程。 現在,有這么一個神器PinMe, 以前部署項目:自己買服務器?域名、 SSL、N…

【LeetCode_26】刪除有序數組中的重復項

刷爆LeetCode系列LeetCode26題:github地址前言題目描述題目與思路分析代碼實現算法代碼優化LeetCode26題: github地址 有夢想的電信狗 前言 本文介紹用C實現leetCode第26題題目鏈接:https://leetcode-cn.com/problems/remove-duplicates-…

CMake構建學習筆記23-SQLite庫的構建

1. 構建思路 在前文中構建了大量的庫包程序(參看CMake構建學習筆記-目錄)之后,可以總結一下在Windows下使用腳本構建程序的辦法: 使用CMake構建。這是目前最通用最流行的構建方式,大部分C/C程序都在逐漸向這個方向轉…

Watt Toolkit下載安裝并加速GitHub

一、下載 官方地址:(Steam++官網) - Watt Toolkit Gitee下載地址:https://gitee.com/rmbgame/SteamTools/releases/tag/3.0.0-rc.16

DevOps運維與開發一體化及Kubernetes運維核心詳解

前言: 在云原生時代,技術的融合與流程的重構已成為驅動業務創新的核心引擎。Kubernetes作為容器編排的事實標準,其穩定的運維能力是業務應用的基石;而DevOps所倡導的開發與運維一體化文化,則是實現快速交付和價值流動的…