【MySQL】 約束

一、約束的定義

MySQL 約束是用于限制表中數據的規則,確保數據的 準確性一致性 。約束可以在創建表時定義,也可以在表創建后通過修改表結構添加。

二、常見的約束類型

2.1 NOT NULL 非空約束

加了非空約束的列不能為 NULL 值,如果可以預見某個列不可能為空,例如(性別:男 或 女 或者 保密)建議都加上非空約束,有利于查詢效率的提高

這里創建一個 student 表,沒有添加任何約束

我們可以往表里添加 NULL 數據,但這是無意義的

接下來通過修改表給 name 列添加上非空約束

數據庫報錯:不能對已經有 NULL 的列添加 非空約束

可以通過將帶有 NULL 的數據刪除或者將列刪除重新創建來進行修改嗎?

這里選擇刪除列后再重新創建,再嘗試往 name 列里添加 NULL

數據庫報錯:'name' 列不能為空

對表進行查看可以看到 name 的 NULL 列變成 NO 了

但是數據依然存在,所以還是需要通過 刪除數據 來進行修改,但數據量大時也不方便。所以最好還是在一開始創建表時就對每個數據做好分析,提前選擇好約束

2.2 DEFAULT 默認值約束

當某個列沒有被插入指定數據時則為默認值

插入數據時注意不能使用全列插入

數據庫報錯:列的數量和輸入值的數量不一致

只能使用指定列插入才可以

查看表可以看到,hobby 列的 DEFAULT 的被修改為了 '無'

2.3?UNIQUE 唯一約束

當我們遇到需要存入不能重復的數據時(例如:身份證號,學號等等)就可以使用 UNIQUE 來指定唯一約束的列

添加約束前

將 id 列添加 UNIQUE 約束后再進行添加數據

數據庫報錯:添加鍵中的值 1 與列中值重復

注意:只添加了 UNIQUE 的列可以寫入多個 NULL

查看表可以看到,id?列的 KEY?的添加了 UNI 表示不可重復

2.4 PRIMARY KEY 主鍵約束

主鍵約束唯一標識數據庫表中的每條幾率,可以理解為當前數據行的身份信息

主鍵必須包含唯一的值,且不能包含 NULL 的值(唯一且非空)

  • 既然是唯一且非空是否能用 id int unique not null 來代替主鍵呢?答案是不可以的,這里要區分開unique not null 是業務對數據本身的需求,primary key則是表的特性,數據如何組織依賴主鍵

通常為每張表指定一個主鍵,主鍵列建議使用 BIGINT 類型(范圍夠大)

重新創建表 student

查看表可以看到,id 列的 Key 變為了 PRI

因為 PRIMARY KEY 的特性一般把主鍵設為自動增長 (auto_increment),插入數據對應字段不給值時,使用最大值+1。

語法:

id INT PRIMARY KEY auto_increment,

可以看到 Extra 處已經有了 自增標識,寫入數據時就不用人為的去維護主鍵值。

可以使用指定列插入

也可以用全列插入,但是需要指定為值為 NULL(并不是為空,而是讓數據庫去填寫)

可以通過命令 show create table 表名?來查看表的具體信息

這里的 AUTO_INCREMENT = 4 是告訴我們下個存入的數據 ID 會等于 4,如果已經設置了自動增長還主題設置 ID 值呢?數據是可以被正常添加的

AUTO_INCREMENT 的值會來到101,如果再添加一個 ID 為 4 的值,也是能正常添加的

但是 AUTO_INCREMENT 的值不會再變小,這是基于對數據的安全考慮,中間浪費的區間也能是浪費了。
每個表只能有一個主鍵,可以由單個列或者多個列組成。還是重新創建一個 student 表,通過PRIVARY KEY(列名1,列名2...)來指定主鍵,多個列組成的主鍵稱作 復合主鍵

復合主鍵中的每一列不能同時相等

主鍵或唯一鍵沖突時的更新操作,插入否則更新

語法:

INSERT ... ON DUPLICATE KEY UPDATE column = value [, column = value] ...

可以看到這里的更新操作針對兩行進行了操作,刪除了原來的行,又新增了一條記錄。如果主鍵沒有沖突則新增一條直接記錄。

在實際開發中不建議直接替換老數據:

  1. 先按條件查詢一下數據,有沒有相應的記錄
  2. 沒有的話就 insert 一條新記錄
  3. 有的話,要么做 update 操作,要么把原數據的刪除標識置為已刪除,再寫一條新數據

2.5 FOREIFN KEY 外鍵約束

外鍵用于定義主表和從表之間的關系

外鍵約束定義在從表的列上,主表關聯的列必須是主鍵或唯一約束

當定義外鍵后,要求從表中的外鍵列數據必須在主表的主鍵或唯一列存在或為 null

主要作用:

  1. 確保引用完整:防止從表引用不存在的主表記錄,確保數據邏輯關系正確;
  2. 維護數據一致:當主表數據變更時,數據庫可以自動處理子表相關數據;
  3. 防止孤立記錄:會阻止刪除被引用的主表記錄,避免子表記錄因主表刪除或修改導致變成“孤立記錄”;
  4. 優化查詢性能:這樣的設計方法可以減少許多不必要數據的冗余。

語法:

foreign key (class_id) references class (id)

實例:

創建一個班級表 class , id 為主鍵

創建一個學生表,一個學生對應一個班級,一個班級對應多個學生,用 id?為主鍵,class_id 為外鍵,關聯表 id

再在表中插入數據

當我們插入引用不存在的數據或是對主表中數據進行刪除時

數據庫都會進行報錯:不能刪除這一行,有一個外鍵約束

如果希望實現當主表修改時,從表自動更新,需要在約定外鍵時,補充??ON DELETE CASCADE

 FOREIGN KEY 外鍵 REFERENCES 主鍵 ON DELETE CASCADE

如果外鍵約束的特性,刪改一定要先刪除從表中的數據,導致在實際工作中一般不使用,可以通過在 JAVA 層面處理關聯關系,保證數據正確后再入庫

2.6 CHECK 約束

引用于一個或多個列,用于限制列中可接受的數據值,從而確保數據的完整性和準確性

這里創建了一個 teacher 表,同時對表中的 gender 做了約束,規定只能為 男 或者 女

當我們使用規定之外的詞就會進行報錯,約束之內就可以正常輸入

列與列直接也可以比較,需要在單獨一行定義

示例:

CREATE TABLE t_check (c1 int check(c1 <> 0),c2 int check(c2 > 0),c3 int,check(c3 >= c2)
);

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

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

相關文章

【.net core】【watercloud】樹形組件combotree導入及調用

源碼下載:combotree: 基于layui及zTree的樹下拉框組件 鏈接中提供了組件的基本使用方法 框架修改內容 1.文件導入&#xff08;路徑可更具自身情況自行設定&#xff09; 解壓后將文件夾放在圖示路徑下&#xff0c;修改文件夾名稱為combotree 2.設置路徑&#xff08;設置layu…

ES101系列07 | 分布式系統和分頁

本篇文章主要講解 ElasticSearch 中分布式系統的概念&#xff0c;包括節點、分片和并發控制等&#xff0c;同時還會提到分頁遍歷和深度遍歷問題的解決方案。 節點 節點是一個 ElasticSearch 示例 其本質就是一個 Java 進程一個機器上可以運行多個示例但生產環境推薦只運行一個…

CppCon 2015 學習:3D Face Tracking and Reconstruction using Modern C++

1. 3D面部追蹤和重建是什么&#xff1f; 3D面部追蹤&#xff08;3D Face Tracking&#xff09;&#xff1a; 實時檢測并追蹤人臉在三維空間中的位置和姿態&#xff08;如轉頭、點頭、表情變化等&#xff09;&#xff0c;通常基于攝像頭捕獲的視頻幀。3D面部重建&#xff08;3D…

代碼中的問題及解決方法

目錄 YOLOX1. AttributeError: VOCDetection object has no attribute cache2. ValueError: operands could not be broadcast together with shapes (8,5) (0,)3. windows遠程查看服務器的tensorboard4. AttributeError: int object has no attribute numel YOLOX 1. Attribu…

【JVM】Java類加載機制

【JVM】Java類加載機制 什么是類加載&#xff1f; 在 Java 的世界里&#xff0c;每一個類或接口在經過編譯后&#xff0c;都會生成對應的 .class 字節碼文件。 所謂類加載機制&#xff0c;就是 JVM 將這些 .class 文件中的二進制數據加載到內存中&#xff0c;并對其進行校驗…

vue的監聽屬性watch的詳解

文章目錄 1. 監聽屬性 watch2. 常規用法3. 監聽對象和route變化4. 使用場景 1. 監聽屬性 watch watch 是一個對象&#xff0c;鍵是需要觀察的表達式&#xff0c;用于觀察 Vue 實例上的一個表達式或者一個函數計算結果的變化。回調函數的參數是新值和舊值。值也可以是方法名&am…

如何在 Ubuntu 24.04 服務器上安裝 Apache Solr

Apache Solr 是一個免費、開源的搜索平臺&#xff0c;廣泛應用于實時索引。其強大的可擴展性和容錯能力使其在高流量互聯網場景下表現優異。 Solr 基于 Java 開發&#xff0c;提供了分布式索引、復制、負載均衡及自動故障轉移和恢復等功能。 本教程將指導您如何在 Ubuntu 24.…

Linux內核中TCP三次握手的實現機制詳解

TCP三次握手是建立可靠網絡連接的核心過程,其在內核中的實現涉及復雜的協議棧協作。本文將深入分析Linux內核中三次握手的實現機制,涵蓋客戶端與服務端的分工、關鍵函數調用、協議號驗證及數據包處理流程。 一、三次握手的整體流程 三次握手分為三個階段,客戶端與服務端通過…

服務器--寶塔命令

一、寶塔面板安裝命令 ?? 必須使用 root 用戶 或 sudo 權限執行&#xff01; sudo su - 1. CentOS 系統&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系統…

優化 Spring Boot API 性能:利用 GZIP 壓縮處理大型有效載荷

引言 在構建需要處理和傳輸大量數據的API服務時&#xff0c;響應時間是一個關鍵的性能指標。一個常見的場景是&#xff0c;即使后端邏輯和數據庫查詢已得到充分優化&#xff0c;當API端點返回大型數據集&#xff08;例如&#xff0c;數千條記錄的列表&#xff09;時&#xff0…

【WPF】WPF 項目實戰:構建一個可增刪、排序的光源類型管理界面(含源碼)

&#x1f4a1;WPF 項目實戰&#xff1a;構建一個可增刪、排序的光源類型管理界面&#xff08;含源碼&#xff09; 在實際的圖像處理項目中&#xff0c;我們經常需要對“光源類型”進行篩選或管理。今天我們來一步步構建一個實用的 WPF 界面&#xff0c;實現以下功能&#xff1…

C++23 已棄用特性

文章目錄 1. std::aligned_storage 與 std::aligned_union1.1 特性介紹1.2 被棄用的原因1.3 替代方案 2. std::numeric_limits::has_denorm2.1 特性介紹2.2 被棄用的原因 3. 總結 C23 已棄用特性包括&#xff1a;std::aligned_storage、std::aligned_union 與 std::numeric_lim…

十三、【核心功能篇】測試計劃管理:組織和編排測試用例

【核心功能篇】測試計劃管理:組織和編排測試用例 前言準備工作第一部分:后端實現 (Django)1. 定義 `TestPlan` 模型2. 生成并應用數據庫遷移3. 創建 `TestPlanSerializer`4. 創建 `TestPlanViewSet`5. 注冊路由6. 注冊到 Django Admin第二部分:前端實現 (Vue3)1. 創建 `Test…

STM32最小CLion開發環境

文章目錄 1 必須文件2 工具鏈3 CLion 全局配置4 CLion 新項目配置ST-Link 調試 5 點亮 LED6 分析 elf 文件7 項目模板 1 必須文件 ST 提供的頭文件支持 MDK-ARM, GCC, IAR 3種編譯器, 下面采用 GCC 編譯器 Arm GNU Toolchain Downloads – Arm Developer 或 安裝包版 調試器服…

核函數:解鎖支持向量機的強大能力

在機器學習的世界中&#xff0c;支持向量機&#xff08;SVM&#xff09;是一種強大的分類算法&#xff0c;而核函數則是其背后的“魔法”&#xff0c;讓 SVM 能夠處理復雜的非線性問題。今天&#xff0c;我們就來深入探討核函數的奧秘&#xff0c;看看它們是如何幫助 SVM 在高維…

【Go-6】數據結構與集合

6. 數據結構與集合 數據結構是編程中用于組織和存儲數據的方式&#xff0c;直接影響程序的效率和性能。Go語言提供了多種內置的數據結構&#xff0c;如數組、切片、Map和結構體&#xff0c;支持不同類型的數據管理和操作。本章將詳細介紹Go語言中的主要數據結構與集合&#xf…

3. 簡述node.js特性與底層原理

&#x1f63a;&#x1f63a;&#x1f63a; 一、Node.js 底層原理&#xff08;簡化版&#xff09; Node.js 是一個 基于 Chrome V8 引擎構建的 JavaScript 運行時&#xff0c;底層核心由幾部分組成&#xff1a; 組成部分簡要說明 1.V8 引擎 將 JS 編譯成機器碼執行&#xff0…

Web開發主流前后端框架總結

&#x1f5a5; 一、前端主流框架 前端框架的核心是提升用戶界面開發效率&#xff0c;實現高交互性應用。當前三大主流框架各有側重&#xff1a; React (Meta/Facebook) 核心特點&#xff1a;采用組件化架構與虛擬DOM技術&#xff08;減少真實DOM操作&#xff0c;優化渲染性能&…

大語言模型備案與深度合成算法備案的區別與聯系

“什么情況下做算法備案&#xff1f;” “什么情況下做大模型備案呢&#xff1f;” 進行大模型備案的企業必然要進行算法備案&#xff0c;而進行算法備案的企業則需根據其提供的服務性質判斷是否需要進行大模型備案。 算法備案與大模型備案已經是個老生常談的話題了&#xf…

微軟PowerBI考試 PL300-Power BI 入門

Power BI 入門 上篇更新了微軟PowerBI考試 PL-300學習指南&#xff0c;今天分享PowerBI入門學習內容。 簡介 Microsoft Power BI 是一個完整的報表解決方案&#xff0c;通過開發工具和聯機平臺提供數據準備、數據可視化、分發和管理。 Power BI 可以從使用單個數據源的簡單…