【MySQL】:約束全解析

個人頭像
🎥 嶼小夏 : 個人主頁
🔥個人專欄 : MySQL從入門到進階
🌄 莫道桑榆晚,為霞尚滿天!

文章目錄

  • 📑前言
  • 一. 約束概述
  • 二. 約束演示
  • 三. 外鍵約束
    • 3.1 介紹
    • 3.2 語法
    • 3.3 刪除/更新行為
  • 🌤?全篇總結

在這里插入圖片描述

📑前言

數據庫中的約束是確保數據完整性和準確性的重要手段。通過對數據表字段的約束設置,可以限制數據的取值范圍、確保數據的唯一性以及建立表與表之間的關聯關系。本文將深入介紹MySQL中的各種約束類型及其使用方法,包括非空約束、唯一約束、主鍵約束、默認約束、檢查約束和外鍵約束,以及如何在創建表和修改表時添加約束,以及外鍵約束的相關知識。

一. 約束概述

概念:約束是作用于表中字段上的規則,用于限制存儲在表中的數據。

目的:保證數據庫中數據的正確、有效性和完整性。

分類:

約束描述關鍵字
非空約束限制該字段的數據不能為nullNOT NULL
唯一約束保證該字段的所有數據都是唯一、不重復的UNIQUE
主鍵約束主鍵是一行數據的唯一標識,要求非空且唯一PRIMARY KEY
默認約束保存數據時,如果未指定該字段的值,則采用默認值DEFAULT
檢查約束(8.0.16版本 之后)保證字段值滿足某一個條件CHECK
外鍵約束用來讓兩張表的數據之間建立連接,保證數據的一致 性和完整性FOREIGN KEY

注意:約束是作用于表中字段上的,可以在創建表/修改表的時候添加約束 。

二. 約束演示

如何在創建表、修改表的時候來指定約束呢,接下來我們就通過一個案例,來演示一下。

字段名字段含 義字段類型約束條件約束關鍵字
idID唯一 標識int主鍵,并且自動增長PRIMARY KEY, AUTO_INCREMENT
name姓名varchar(10)不為空,并且唯一NOT NULL , UNIQUE
age年齡int大于0,并且小于等 于120CHECK
status狀態char(1)如果沒有指定該值, 默認為1DEFAULT
gender性別char(1)

對應的建表語句為:

CREATE TABLE tb_user(id int AUTO_INCREMENT PRIMARY KEY COMMENT 'ID唯一標識',name varchar(10) NOT NULL UNIQUE COMMENT '姓名' ,age int check (age > 0 && age <= 120) COMMENT '年齡' ,status char(1) default '1' COMMENT '狀態',gender char(1) COMMENT '性別'
);	

在為字段添加約束時,我們只需要在字段之后加上約束的關鍵字即可,需要關注其語法。我們執行上面的SQL把表結構創建完成,然后接下來,就可以通過一組數據進行測試,從而驗證一下,約束是否可以生效。

insert into tb_user(name,age,status,gender) values ('Tom1',19,'1','男'),
('Tom2',25,'0','男');
insert into tb_user(name,age,status,gender) values ('Tom3',19,'1','男');
insert into tb_user(name,age,status,gender) values (null,19,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom3',19,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom4',80,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom5',-1,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom5',121,'1','男');
insert into tb_user(name,age,gender) values ('Tom5',120,'男');

三. 外鍵約束

3.1 介紹

外鍵:用來讓兩張表的數據之間建立連接,從而保證數據的一致性和完整性。

我們來看一個例子:

image-20231220104217784

左側的emp表是員工表,里面存儲員工的基本信息,包含員工的ID、姓名、年齡、職位、薪資、入職日期、上級主管ID、部門ID,在員工的信息中存儲的是部門的ID dept_id,而這個部門的ID是關聯的部門表dept的主鍵id,那emp表的dept_id就是外鍵,關聯的是另一張表的主鍵。

注意

目前上述兩張表,只是在邏輯上存在這樣一層關系;在數據庫層面,并未建立外鍵關聯,所以是無法保證數據的一致性和完整性的。

3.2 語法

添加外鍵

CREATE TABLE 表名(字段名 數據類型,...[CONSTRAINT] [外鍵名稱] FOREIGN KEY (外鍵字段名) REFERENCES 主表 (主表列名)
);
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段名)REFERENCES 主表 (主表列名) ;

刪除外鍵

ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;

3.3 刪除/更新行為

添加了外鍵之后,再刪除父表數據時產生的約束行為,我們就稱為刪除/更新行為。具體的刪除/更新行為有以下幾種:

行為說明
NO ACTION當在父表中刪除/更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不 允許刪除/更新。 (與 RESTRICT 一致) 默認行為
RESTRICT當在父表中刪除/更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不 允許刪除/更新。 (與 NO ACTION 一致) 默認行為
CASCADE當在父表中刪除/更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有,則 也刪除/更新外鍵在子表中的記錄。
SET NULL當在父表中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則設置子表 中該外鍵值為null(這就要求該外鍵允許取null)。
SET DEFAULT父表有變更時,子表將外鍵列設置成一個默認的值 (Innodb不支持)

具體語法為:

ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段) REFERENCES 主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;

🌤?全篇總結

本文詳細介紹了MySQL中的各種約束類型及其語法,包括約束的概念、分類、使用方法和外鍵約束的相關知識。通過學習本文,讀者可以掌握如何在數據庫設計和管理中靈活運用約束,從而保證數據的完整性和準確性,提高數據庫的穩定性和安全性。

image-20231220160021552

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

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

相關文章

Mybatis - generator(自動生成)

1、生成數據庫數據 2、配置pom文件 這個plugin文件里有配置項和依賴以及版本號 修改configurationFile路徑為項目里存在的generatorConfig.xml文件&#xff0c;因為后續的配置都在這個文件中進行。 <plugin><groupId>org.mybatis.generator</groupId><…

Netty的InboundHandler 和OutboundHandler

一、InboundHandler 和OutboundHandler的區別 在Netty中&#xff0c;"inbound"表示來自外部來源&#xff08;如網絡連接&#xff09;的數據&#xff0c;而"outbound"則表示從應用程序發送到外部目標&#xff08;如網絡連接或其他服務&#xff09;的數據。…

Git——Upload your open store

0.default config ssh-keygen -t rsa #之后一路回車,當前目錄.ssh/下產生公私鑰 cat ~/.ssh/id_rsa.pub #復制公鑰到賬號 git config --global user.email account_email git config --global user.name account_name1. 上傳一個公開倉庫 查看當前分支&#xff1a; git branc…

MATLAB基于隱馬爾可夫模型-高斯混合模型-期望最大化的MR圖像分割

隱馬爾可夫模型是一種統計模型&#xff0c;它描述了馬爾可夫過程&#xff0c;隱馬爾可夫過程中包含隱變量&#xff0c;語音識別和詞性自動標注等一些領域常常使用隱馬爾可夫模型方法來處理。馬爾可夫過程是一類隨機過程&#xff0c;馬爾可夫鏈是它的原始模型&#xff0c;馬爾可…

GPT對話知識庫——FreeRTOS中寄存器BASEPRI的作用

提問模型&#xff1a;GPT-4-TURBO-PREVIEW 提問時間&#xff1a;2024.03.02 1&#xff0c;問&#xff1a; 舉例詳細說明寄存器BASEPRI在freertos中作用 1&#xff0c;答&#xff1a; 在使用FreeRTOS這樣的實時操作系統時&#xff0c;確保系統的實時性和響應能力至關重要。其中…

【C++那些事兒】深入理解C++類與對象:從概念到實踐(中)| 默認構造函數 | 拷貝構造函數 | 析構函數 | 運算符重載 | const成員函數

&#x1f4f7; 江池俊&#xff1a; 個人主頁 &#x1f525;個人專欄&#xff1a; ?數據結構冒險記 ?C那些事兒 &#x1f305; 有航道的人&#xff0c;再渺小也不會迷途。 文章目錄 1. 類的6個默認成員函數2. 構造函數2.1 概念2.2 特性 3. 析構函數3.1 概念3.2 特性 4. 拷貝…

國際視頻編解碼標準提案下載地址

H.266 相關提案下載地址&#xff1a;http://phenix.it-sudparis.eu/jvet/ 更新的地址&#xff1a;https://jvet-experts.org/ H.265 提案下載地址&#xff1a;http://phenix.int-evry.fr/jct/ 標準文檔下載地址&#xff1a;http://www.itu.int/rec/T-REC-H.265 H.264 提案下載…

QT多語言切換功能

一.目的 在做項目時&#xff0c;有時希望我們的程序可以在不同的國家使用&#xff0c;這樣最好的方式是一套程序能適應于多國語言。 Qt提供了這樣的功能&#xff0c;使得一套程序可以呈現出不同的語言界面。本文將介紹QT如何實現多語言&#xff0c;以中文和英文為例。 QT開發…

過于老舊的pytorch_ssim包 請從github下載源碼

有些冷門算法真的不要隨便pip&#xff0c;有可能下載到史前版本…最好還是找源代碼 汗 今天要用到SSIM損失函數&#xff0c;從網上簡單看了一下原理就想測試一下&#xff0c;偷了一下懶就直接在命令行輸入pip install pytorch_ssim了&#xff0c;結果報了一堆錯誤&#xff08;汗…

Qt將Unicode轉換成UTF8中文

解析字符串&#xff0c;并將里面的Unicode轉換成中文 QString unicodeToUtf8(QString unicode) {QString result;for (int i 0; i < unicode.length(); i){QString flag unicode.mid(i,2); if (flag "\\u"){QString s1 unicode.mid(i 2, 4);result.append(s…

如何自定義一個spring-boot-starter

在我的理解中&#xff0c;spring-boot-starter就是一個依賴工具包&#xff0c;但是它和普通的依賴又有所區別&#xff0c;那么首先spring-boot-starter-一定是一個spring-boot項目&#xff0c;然后它和一般的依賴有什么區別呢&#xff0c;我們可以在它的resources目錄下定義一個…

Mysql實戰(1)之環境安裝

1&#xff0c;進入&#xff1a;MySQL :: MySQL Downloads 2&#xff0c; 3&#xff0c; 4&#xff0c;

【數據集】中國廣泛時空水質數據集(1980-2022)

中國廣泛時空水質數據集(1980-2022) 1 數據概述1.1 數據細節2 數據下載下載鏈接1:figshare參考1 數據概述 水質數據是評估水生生態系統福祉和確保人類清潔水源的關鍵資源。雖然水質數據集的可用性正在增長,但值得注意的是,中國缺乏可公開訪問的內陸和海洋國家水質數據集。…

Python算法題集_單詞搜索

Python算法題集_單詞搜索 題22&#xff1a;單詞搜索1. 示例說明2. 題目解析- 題意分解- 優化思路- 測量工具 3. 代碼展開1) 標準求解【原始矩陣狀態回溯】2) 改進版一【字典檢測原始矩陣狀態回溯】3) 改進版二【矩陣狀態回溯】 4. 最優算法5. 相關資源 本文為Python算法題集之一…

DM數據庫學習之路(十九)DM8數據庫sysbench部署及壓力測試

sysbench部署 安裝依賴 yum -y install make automake libtool pkgconfig libaio-devel vim-common 上傳sysbench源代碼 sysbench_tool.tar 測試是否安裝成功 $ /opt/sysbench/sysbench-master-dpi/src/lua $ ./sysbench --version sysbench 1.1.0 sysbench測試DM 測試…

jupyter調用envs環境——jupyter內核配置虛擬環境

1.jupyter無法使用envs環境 pycharm的終端打開jupyter notebook&#xff1a; 在kernel下找不到上面的Pytorch_GPU環境&#xff1a; 2.解決方法 在對應的envs環境中安裝ipykernel&#xff1a; 將該環境寫入jupyter&#xff1a; python -m ipykernel install --user --name Py…

基于分位數回歸的長短期記憶神經網絡(QRLSTM)的MATLAB實現(源代碼)

分位數回歸的長短期神經記憶網絡介紹&#xff1a; QRLSTM&#xff08;Quantile Regression Long Short-Term Memory&#xff09;分位數回歸神經網絡是一種結合了長短期記憶&#xff08;LSTM&#xff09;神經網絡和分位數回歸的模型。這種神經網絡結構旨在對數據的不同分位數進行…

Java的四大引用詳解-沖擊金三銀四

強引用 像“Object obj new Object()”這類的引用均為強引用&#xff0c;當一個對象被強引用變量引用時&#xff0c;它處于可達狀態&#xff0c;是不可能被垃圾回收器回收的&#xff0c;即使該對象永遠不會被用到也不會被回收。 當JVM出現內存不足時&#xff0c;JVM進行垃圾回…

繼承-重寫

Phone基類&#xff1a; package ven;public class Phone {public Phone(){}public void call(String name){System.out.println("給"name"打電話");} } AIPhone子類&#xff1a; package ven;public class AIPhone extends Phone{Override //重載注解&am…

mTLS: openssl創建CA證書

證書可以通過openssl或者keytool創建&#xff0c;在本篇文章中&#xff0c;只介紹openssl。 openssl 生成證書 申請操作流程 生成ca證書私鑰, 文件名&#xff1a;ca.key生成ca證書&#xff0c;文件名&#xff1a;ca.crt生成Server/Client 證書私鑰&#xff0c;文件名&#x…