MySQL 約束(入門版)

目錄

一、約束的基本概念

二、約束演示

三、外鍵約束

(一)介紹

(二)外鍵約束語法

(三)刪除/更新行為


一、約束的基本概念

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

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

3、分類

4、作用

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

????????非空約束、唯一約束、主鍵約束、默認約束、檢查約束主要用于限定對應字段的數據,在DDL (數據定義語言)中使用。

????????外鍵約束用于建立兩表之間的聯系,在更新與刪除對應內容時,兩表發生對應的變化。

二、約束演示

????????上面我們介紹了數據庫中常見的約束,以及約束涉及到的關鍵字,那這些約束我們到底如何在創建表、 修改表的時候來指定呢,接下來我們就通過一個案例,來演示一下。

????????案例需求: 根據需求,完成表結構的創建。需求如下:

對應的建表語句為:

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 '性別'
);

????????在為字段添加約束時,我們只需要在字段之后加上約束的關鍵字即可如果有多個約束,則使用空格隔開。如果需要 id 字段是主鍵并且自增,則可以再使用關鍵字auto_increment。

????????因為?id 列被定義為自增主鍵,所以插入數據時通常不需要顯式地為該列指定值,數據庫會自動為其生成一個唯一且遞增的值。

????????我們執行上面的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','男');--第一條因為名字為null,第二條因為名字重復,所以這兩條都不能正常執行
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,'男');

三、外鍵約束

(一)介紹

1、外鍵約束的基本概念? ? ? ??

????????外鍵用來讓兩張表的數據之間建立連接,從而保證數據的一致性和完整性。接下來,我們來看一個例子。

????????左側的emp表是員工表,里面存儲員工的基本信息,包含員工的id、姓名、年齡、職位、薪資、入職日期、上級主管id、部門id。

????????右側的dept表是部門表,里面存儲部門的基本信息,包括含部門的id與名字。

? ? ? ? 在員工表emp中,部門id (dept_id)作為外鍵,關聯部門表dept的主鍵id。

????????具有外鍵的表被稱為子表,外鍵所關聯的表被稱為父表所以上面的員工表emp是子表,而部門表dept是父表。

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

2、外鍵約束測試

????????沒有數據庫外鍵關聯的情況下,能否保證一致性和完整性呢,我們建表來測試一下。

create table dept(id int auto_increment comment 'ID' primary key,name varchar(50) not null comment '部門名稱'
)comment '部門表';
insert into dept (id, name) values (1, '研發部'), (2, '市場部'),(3, '財務部'), (4, '銷售部'), (5, '總經辦');
create table emp(id int auto_increment comment 'ID' primary key,name varchar(50) not null comment '姓名',age int comment '年齡',job varchar(20) comment '職位',salary int comment '薪資',entrydate date comment '入職時間',managerid int comment '直屬領導ID',dept_id int comment '部門ID'
)comment '員工表';insert into emp (id, name, age, job,salary, entrydate, managerid, dept_id)
values(1, '金庸', 66, '總裁',20000, '2000-01-01', null,5),(2, '張無忌', 20, '項目經理',12500, '2005-12-05', 1,1),(3, '楊逍', 33, '開發', 8400,'2000-11-03', 2,1),(4, '韋一笑', 48, '開發',11000, '2002-02-05', 2,1),(5, '常遇春', 43, '開發',10500, '2004-09-07', 3,1),(6, '小昭', 19, '程序員鼓勵師',6600, '2004-10-12',2,1);

????????接下來,我們可以做一個測試,刪除id為1的部門信息。

? ? ? ? 結果,我們看到刪除成功之后,部門表不存在id為1的部門,而在emp表中還有很多的員工,關聯的為id為1的部門,此時就出現了數據的不完整性。 而要想解決這個問題就得通過數據庫的外鍵約束。

(二)外鍵約束語法

1、添加外鍵

(1)在建表時添加外鍵

create?table?表名(
????????字段名 數據類型,
????????...
????????[ constraint ] [外鍵名稱] foreign key?(外鍵字段名) references 主表 (主表列名)?
);

????????在創建外鍵約束時,constraint 關鍵字是可選的,它的主要作用是為外鍵約束命名,方便后續對外鍵約束進行管理,比如刪除或者修改外鍵約束等操作

????????如果不使用 constraint 關鍵字,數據庫會自動為約束生成一個默認名稱。

????????如果需要查詢這默認名稱,可以通過查詢 information_schema.table_constraints?系統表來獲取外鍵約束的名稱。以下是一個示例查詢,用于查找 employees 表的外鍵約束名稱:

select constraint_name
from information_schema.table_constraints
where table_schema = database() and table_name = 'employees'and constraint_type = 'foreign key';

? ? ? ? 查詢中,table_schema = database()用于指定當前數據庫,table_name= employees'表示要查找employees表的外鍵約束,constraint_type = 'foreign key'確保只查找外鍵約束

(2)建表后額外添加

alter table 表名

add constraint 外鍵名稱 foreign key (外鍵字段名)?references 主表 (主表列名) ;

????????案例:為 emp 表的 dept_id 字段添加外鍵約束,關聯dept表的主鍵id。

alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);

? ? ? ? 此時在表中可以發現,字段dept_id出現了藍色鑰匙的形狀,這是外鍵約束;字段id顯示的是黃色鑰匙的形狀,這是主鍵約束

????????添加了外鍵約束之后,我們再到dept表(父表)刪除id為1的記錄,此時將會報錯,不能刪除或更新父表記錄,因為存在外鍵約束。

2、刪除外鍵

alter table 表名 drop foreign key 外鍵名稱;

????????案例:刪除emp表的外鍵fk_emp_dept_id。

alter table emp drop foreign key fk_emp_dept_id;
(三)增加外鍵約束后的刪除/更新行為

1、具體的刪除/更新行為

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

? ? ? ? 如果沒有規定對應的行為,默認行為是restrict,同時no action與其作用一致。

????????cascade 的作用是級聯。如果父表的內容被刪除了,其對應子鍵所在行的數據也會被刪除。如果父表的內容被更新了,其對應子鍵也會更新對應內容。

????????在父鍵的內容被刪除時,如果有對應外鍵,set null 會將其設置成 null,set default會將其設置為一個默認的值。

2、具體的語法

alter table 表名

add constraint 外鍵名稱 foreign key (外鍵字段) references?主表名 (主表字段名)

on update (更新行為) on delete (刪除行為);

3、具體演示

????????由于 restrict 是默認行為,我們前面語法演示時,已經測試過了,就不再演示了,這里我們再演示其他的兩種行為:cascade、set null。

(1)cascade

alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update cascade on delete cascade ;

修改父表id為1的記錄,將id修改為6

????????我們發現,原來在子表中dept_id值為1的記錄,現在也變為6了,這就是cascade級聯的效果。在一般的業務系統中,不會修改一張表的主鍵值。

② 刪除父表id為6的記錄

(2)set null

????????在進行測試之前,我們先需要刪除上面建立的外鍵 fk_emp_dept_id。然后再通過數據腳本,將emp、dept表的數據恢復了。

????????接下來,我們刪除id為1的數據,看看會發生什么樣的現象。

????????我們發現父表的記錄是可以正常的刪除的,父表的數據刪除之后,再打開子表 emp,我們發現子表emp的dept_id字段,原來dept_id為1的數據,現在都被置為null了。這就是 set null 這種刪除/更新行為的效果。
????????
????????以上即為MySQL 約束(入門版)的全部內容,創作不易,麻煩三連支持一下唄~??

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

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

相關文章

【ISP】ISP pipeline(AI)

ISP Pipeline 全流程概覽 ISP&#xff08;Image Signal Processing&#xff0c;圖像信號處理&#xff09;流程通常從原始 Bayer 數據出發&#xff0c;經過一系列模塊處理&#xff0c;逐步完成圖像校正和增強&#xff0c;最終生成用于顯示或編碼的標準圖像。常見處理模塊包括&a…

【Rust開發】Rust快速入門,開發出Rust的第一個Hello World

?? 歡迎大家來到景天科技苑?? &#x1f388;&#x1f388; 養成好習慣&#xff0c;先贊后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者簡介&#xff1a;景天科技苑 &#x1f3c6;《頭銜》&#xff1a;大廠架構師&#xff0c;華為云開發者社區專家博主&#xff0c;…

Google Chrome下載受限制的解決方案【方法指南】

在國內使用網絡時&#xff0c;部分用戶在嘗試訪問Google Chrome官網下載谷歌瀏覽器時&#xff0c;常常遇到網頁無法打開或文件下載失敗的情況。這種下載受限制的問題多由網絡訪問政策或DNS解析異常導致。為了正常獲取Google Chrome的最新版安裝程序&#xff0c;用戶需要通過一些…

使用 new EventSource 實現前端實時通信

示例&#xff1a; eventSource單向通信 1. 什么是 EventSource&#xff1f; EventSource 是瀏覽器提供的一種實現服務器推送&#xff08;Server-Sent Events&#xff0c;簡稱 SSE&#xff09;功能的 API。它是基于 HTTP 協議的單向通信機制&#xff0c;可以通過服務器將實時數…

Android Input——查找并添加目標窗口(七)

在 Android 輸入系統中,InputDispatcher 的核心職責之一是將輸入事件正確地傳遞到目標窗口。上一篇文章我們介紹到 InputDispatcher 事件分發調用到 findFocusedWindowTargetsLocked() 函數查找焦點窗口,并將焦點窗口添加到目標窗口,這里我們繼續往下看。 一、獲取焦點窗口…

Spring Boot中Spring MVC相關配置的詳細描述及表格總結

以下是Spring Boot中Spring MVC相關配置的詳細描述及表格總結&#xff1a; Spring MVC 配置項詳解 1. 異步請求配置 spring.mvc.async.request-timeout 描述&#xff1a;設置異步請求的超時時間&#xff08;單位&#xff1a;毫秒&#xff09;。默認值&#xff1a;未設置&…

HTTP GET 和 POST 請求有什么區別

HTTP 的 GET 和 POST 請求是兩種常見的 HTTP 請求方法&#xff0c;它們有不同的特點和應用場景。以下是它們的主要區別&#xff1a; 1. 用途 GET&#xff1a;用于從服務器獲取數據或資源。GET 請求會附帶查詢參數在 URL 中&#xff0c;通常用于請求數據&#xff0c;如加載網頁…

從入門到精通【MySQL】 聯合查詢

文章目錄 &#x1f4d5;摘要&#x1f4d5;1. 多表聯合查詢時MySQL內部原理??1.1 實例&#xff1a;一個完整的聯合查詢過程 &#x1f4d5;2. 內連接&#x1f4d5;3. 外連接&#x1f4d5;4. 自連接&#x1f4d5;5. 子查詢??5.1 單行子查詢??5.2 多行子查詢??5.3 多列子查…

高可用之戰:Redis Sentinal(哨兵模式)

參考&#xff1a;Redis系列24&#xff1a;Redis使用規范 - Hello-Brand - 博客園 1 背景 在我們的《Redis高可用之戰&#xff1a;主從架構》篇章中&#xff0c;介紹了Redis的主從架構模式&#xff0c;可以有效的提升Redis服務的可用性&#xff0c;減少甚至避免Redis服務發生完…

加密≠安全:文件夾密碼遺忘背后的數據丟失風險與應對

在數字化時代&#xff0c;保護個人隱私和數據安全變得尤為重要。許多人選擇對重要文件夾進行加密&#xff0c;以防止未經授權的訪問。然而&#xff0c;一個常見且令人頭疼的問題也隨之而來——文件夾加密密碼遺忘。當你突然發現自己無法訪問那些加密的文件夾時&#xff0c;那種…

WPS宏開發手冊——附錄

目錄 系列文章7、附錄 系列文章 使用、工程、模塊介紹 JSA語法 JSA語法練習題 Excel常用Api Excel實戰 常見問題 附錄 7、附錄 顏色序列&#xff1a;在excel中設置顏色&#xff0c;只能設置顏色序號&#xff0c;不能直接設置rgb顏色 1、黑色 (Black)…

C++基礎精講-02

文章目錄 1.C/C申請、釋放堆空間的方式對比1.1C語言申請、釋放堆空間1.2C申請、釋放堆空間1.2.1 new表達式申請數組空間 1.3回收空間時的注意事項1.4malloc/free 和 new/delete 的區別 2.引用2.1 引用的概念2.2 引用的本質2.3 引用與指針的聯系與區別2.4 引用的使用場景2.4.1 引…

Spring Boot MongoDB 分頁工具類封裝 (新手指南)

Spring Boot MongoDB 分頁工具類封裝 (新手指南) 目錄 引言&#xff1a;為何需要分頁工具類&#xff1f;工具類一&#xff1a;PaginationUtils - 簡化 Pageable 創建 設計目標代碼實現 (PaginationUtils.java)如何使用 PaginationUtils 工具類二&#xff1a;PageResponse<…

MyBatis的緩存、逆向工程、使用PageHelper、使用PageHelper

一、MyBatis的緩存 緩存&#xff1a;cache 緩存的作用&#xff1a;通過減少IO的方式&#xff0c;來提高程序的執行效率。 mybatis的緩存&#xff1a;將select語句的查詢結果放到緩存&#xff08;內存&#xff09;當中&#xff0c;下一次還是這條select語句的話&#xff0c;直…

java中的JNI調用c庫

1. 簡單demo 如果是在某個項目中有包名就需要自己找ai問問去改寫下cmd命令去編譯執行等 java文件&#xff08;HelloJNI.java&#xff09; public class HelloJNI {// 聲明 native 方法public native void sayHello();// 加載本地庫static {System.loadLibrary("hello&quo…

人工智能:GPT技術應用與未來展望

GPT(Generative Pre-trained Transformer)作為自然語言處理領域的代表性技術,近年來在各行業的實際應用中展現出廣泛潛力。結合其技術特性與行業需求,以下是GPT的主要應用場景、案例分析及未來挑戰的總結: 一、核心應用領域與案例 文本生成與內容創作 自動化內容生產:GPT…

前端筆記-ECMAScript語法概覽

更多詳細可以查看1.1 ES6 教程 | 菜鳥教程 這里我將大概記錄ES與JS大概不一樣的部分&#xff0c;方便聯合記憶。 歷史與關系 ECMAScript&#xff1a;是一種由 Ecma 國際組織制定的腳本語言規范&#xff0c;它是 JavaScript 的標準化版本。ECMAScript 為 JavaScript 提供了語…

操作主機的管理

1.在AD林范圍內&#xff0c;有哪幾個操作主機角色 架構主機&#xff08;Schema Master&#xff09; 功能&#xff1a;負責整個AD林中所有對象和屬性的定義&#xff0c;是唯一可以更新目錄架構的DC。架構更新會從架構主機復制到目錄林中的所有其他域控制器。 作用范圍&#xf…

【Linux】網絡編程

目錄 端口號 網絡字節序 socket編程 接口 sockaddr結構 udp網絡程序 創建套接字 綁定 接收 發送 客戶端需要綁定嗎&#xff1f; 客戶端執行方法 本地環回地址 終端文件 代碼 tcp網絡程序 SOCK_STREAM 監聽 查詢網絡信息 獲取新連接 地址轉換函數 客戶端綁…

Go 語言中的select是做什么的

Go 語言中的 select 是做什么的 在 Go 語言中&#xff0c;select 語句是用于處理多個通道&#xff08;channel&#xff09;操作的一種控制結構。它類似于 switch 語句&#xff0c;但專門用于并發編程&#xff0c;允許 Goroutine 在多個通道上等待操作&#xff08;發送或接收&a…