SQL-約束

在 SQL 中,約束(Constraint)是用于限制表中數據的規則,目的是保證數據的完整性、一致性和有效性。常見的約束類型包括:主鍵約束、外鍵約束、非空約束、唯一約束、檢查約束、默認值約束等。下面結合你提供的代碼,詳細講解這些約束及其應用。

一、SQL 中常見的約束類型

  1. 主鍵約束(PRIMARY KEY)

    • 作用:唯一標識表中的每條記錄,確保記錄的唯一性。
    • 特點:一個表只能有一個主鍵;主鍵列的值不能重復(唯一),且不能為NULL;通常與auto_increment(自增)配合使用,自動生成唯一值。
  2. 非空約束(NOT NULL)

    • 作用:限制列的值不能為NULL,必須提供具體數據。
    • 特點:如果插入數據時未指定該列的值,會報錯。
  3. 唯一約束(UNIQUE)

    • 作用:確保列中的所有值都是唯一的(不重復)。
    • 特點:與主鍵的區別是,一個表可以有多個唯一約束;唯一約束允許列值為NULL(且可以有多個NULL,因為NULL不等于任何值)。
  4. 檢查約束(CHECK)

    • 作用:限制列的值必須滿足指定的條件(如范圍、格式等)。
    • 特點:確保數據符合業務規則,例如年齡必須在 0-120 之間。
  5. 默認值約束(DEFAULT)

    • 作用:當插入數據時未指定該列的值,自動使用默認值。
  6. 外鍵約束(FOREIGN KEY)

    • 作用:建立兩個表之間的關聯關系(父子表),確保子表中引用的外鍵值在主表的主鍵中存在(或為NULL),維護數據的參照完整性。
    • 相關概念:
      • 主表(父表):被引用的表(如dept表)。
      • 子表(從表):引用主表的表(如emp表)。
      • 外鍵列:子表中用于關聯主表主鍵的列(如emp.dept_id關聯dept.id)。
    • 級聯操作(通過ON UPDATEON DELETE指定):
      • CASCADE:當主表的主鍵更新 / 刪除時,子表的外鍵值同步更新 / 刪除。
      • SET NULL:當主表的主鍵更新 / 刪除時,子表的外鍵值設為NULL(需確保外鍵列允許NULL)。

二、代碼詳解

以下是對提供的 SQL 代碼的逐段解釋:

1. 創建user
create table user(id int primary key auto_increment comment '主鍵',  -- 主鍵約束+自增name varchar(10) not null unique comment '姓名',   -- 非空約束+唯一約束age int check (age >= 0 and age <= 120) comment '年齡',  -- 檢查約束status char(1) default '1' comment '狀態',  -- 默認值約束gender char(1) comment '性別'  -- 無特殊約束
)comment '用戶表';
  • id:主鍵(primary key),確保每條用戶記錄唯一;auto_increment表示插入時無需手動指定,自動遞增生成。
  • namenot null(必須提供姓名)+?unique(姓名不能重復)。
  • agecheck約束限制年齡必須在 0-120 之間(若插入年齡為 150,會報錯)。
  • statusdefault '1'表示若插入時未指定status,默認值為 '1'(可理解為 “正常” 狀態)。
2. 插入數據到user
-- 插入3條完整數據
insert into user(name, age, status, gender) values 
('Tom1', 19, '0', '男'),
('Tom2', 25, '1', '女'),
('Tom3', 17, '0', '男');-- 插入時未指定status,會使用默認值'1'
insert into user(name, age, gender) values ('Tom5', 32,'男');
  • 第一條插入語句顯式指定了所有列的值,status分別為 '0'、'1'、'0'。
  • 第二條插入語句未指定status,因此status會自動使用默認值 '1'。
3. 創建dept表(部門表)
create table dept(id int primary key auto_increment comment 'ID' ,  -- 主鍵+自增name varchar(50) not null comment '部門名稱'  -- 非空約束
)comment '部門表';-- 插入部門數據
insert into dept values (1, '研發部'),(2,'市場部'),(3, '財務部'),(4, '銷售部'),(5, '總經辦');
  • id:部門唯一標識(主鍵 + 自增)。
  • namenot null確保部門名稱必須填寫(不能為NULL)。
4. 創建emp表(員工表)及外鍵操作
-- 創建員工表
create table emp(id int primary key auto_increment comment 'ID' ,  -- 主鍵+自增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'  -- 外鍵,關聯dept表的id
)comment '員工表';-- 插入員工數據
insert into emp values 
(1, '金庸', 66, '總裁', 20000, '2000-01-01', null, 5),  -- 總裁無領導(managerid為null),屬于總經辦(dept_id=5)
(2, '張無忌', 20, '項目經理', 12500, '2005-12-01', 1, 1),  -- 領導是金庸(id=1),屬于研發部(dept_id=1)
...  -- 其他員工數據
  • emp表的dept_id用于關聯dept表的id(表示員工所屬部門),后續通過外鍵約束正式建立關聯。
5. 外鍵約束的添加、刪除與修改
-- 第一次添加外鍵約束:關聯emp.dept_id到dept.id(無特殊級聯操作)
alter table emp add constraint fk_emp_dept_id 
foreign key (dept_id) references dept(id);-- 刪除外鍵約束
alter table emp drop foreign key fk_emp_dept_id;-- 第二次添加外鍵:級聯更新和刪除(主表操作影響子表)
alter table emp add constraint fk_emp_dept_id 
foreign key (dept_id) references dept(id) 
on UPDATE cascade  -- 當dept.id更新時,emp.dept_id同步更新
on DELETE cascade;  -- 當dept的記錄刪除時,emp中對應記錄也刪除-- 第三次修改外鍵:主表操作時子表外鍵設為NULL
alter table emp add constraint fk_emp_dept_id 
foreign key (dept_id) references dept(id) 
on update set null  -- 當dept.id更新時,emp.dept_id設為NULL
on delete set null;  -- 當dept的記錄刪除時,emp.dept_id設為NULL
  • 外鍵約束名稱fk_emp_dept_id是自定義的(通常格式為fk_子表_外鍵列)。
  • 第一次添加的外鍵無ON UPDATE/DELETE,表示若主表deptid被更新或記錄被刪除,而子表emp中仍有引用,會直接報錯(阻止操作)。
  • ON UPDATE CASCADE ON DELETE CASCADE:例如,若dept表中id=1(研發部)被更新為10,則emp表中所有dept_id=1的記錄會自動變為10;若研發部記錄被刪除,所有屬于研發部的員工記錄也會被刪除。
  • ON UPDATE SET NULL ON DELETE SET NULL:例如,若研發部(id=1)被刪除,emp表中所有dept_id=1的員工,其dept_id會被設為NULL(表示 “無部門”)。

三、總結

約束是 SQL 中保證數據質量的核心機制:

  • 主鍵、唯一約束確保數據唯一性;
  • 非空、檢查約束確保數據有效性;
  • 默認值約束簡化數據插入;
  • 外鍵約束維護表之間的關聯完整性,通過級聯操作靈活處理主表變更對從表的影響。

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

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

相關文章

kafka如何保證消息不被重復消費

首先kafka事務沒辦法做到這一點&#xff0c;事務只能保證以下幾點&#xff1a;producer發送多條消息&#xff0c;要么同時成功&#xff0c;要么同時失敗&#xff1b;在沒有提交事務之前&#xff0c;消息對消費者不可見&#xff0c;事務失敗需要程序員自己調用kafka的 abort 回滾…

[性能分析與優化]偽共享問題(perf + cpp)

偽共享問題的主要來源有兩件事每次cache讀入一個數據時實際上讀入整個數據行多個線程可能會讀入相同的數據行由于cache寫回內存時也是按照數據行進行寫入的&#xff0c;導致了寫回內存時并不能做到真正的共享&#xff0c;而是需要等待。解決方案有兩種將需要并行計算的數據使用…

【Uni-App+SSM 寵物項目實戰】Day14:商家服務列表

一、前言 歡迎回到mypet項目實戰!?? 今天我們實現商家服務管理核心功能——商家服務列表展示與上拉加載更多。商家成功注冊并通過審核后,可發布寵物服務項目(如洗澡、美容、醫療等),用戶通過服務列表瀏覽并預約。 本次實現的核心是**“分頁加載”**技術:后端使用MyBa…

DNS服務管理

一、概述 概念 Domain Name Service&#xff0c;一套分布式的域名服務系統&#xff0c;即有多個DNS服務器遍布于世界。每個DNS服務器上存放著大量的機器域名和IP地址的映射&#xff0c;并且是動態更新。眾多網絡客戶端程序都使用DNS協議來向DNS服務器查詢目標主機的IP地址。 …

自定義類型:結構體、聯合與枚舉(2)

目錄 前言 一、 聯合體類型的聲明 介紹&#xff1a; 注意&#xff1a; 二、 聯合體的特點 介紹&#xff1a; 代碼舉例&#xff1a; 三、聯合體??的計算 介紹&#xff1a; 聯合體大小的計算規則 1. 基礎規則 1. 確定最大成員大小 2. 計算對齊模數的最小公倍數 3…

Oceanbase下使用TPC-H模式生成數據

1.下載tpc-h http://www.tpc.org/ 點擊下載始終彈出這個畫面&#xff0c;嘗試了多種方法無效&#xff0c;最后選擇科學上網工具&#xff0c;才正常下載。 通過網盤分享的文件&#xff1a;TPC-H-Toolv3.zip 鏈接: https://pan.baidu.com/s/14CXrp7v_7XkPtXfFLkziBQ?pwdqf5t 提…

LeetCode 面試經典 150_哈希表_單詞規律(41_290_C++_簡單)

LeetCode 面試經典 150_哈希表_單詞規律&#xff08;41_290_C_簡單&#xff09;題目描述&#xff1a;輸入輸出樣例&#xff1a;題解&#xff1a;解題思路&#xff1a;思路一&#xff08;哈希表&#xff09;&#xff1a;代碼實現代碼實現&#xff08;思路一&#xff08;哈希表&a…

librespeed c++ 上傳下載帶寬測試 排坑全流程

在搭建 LibreSpeed 測速服務并實現基于 curl/API 的上傳下載測試時&#xff0c;遇到 Nginx 配置沖突、PHP 權限異常等問題。本文將梳理從環境搭建到功能驗證的全流程&#xff0c;針對 “curl 上傳報 404/405”“PHP-FPM 權限拒絕”等典型問題&#xff0c;提供可復現的解決方案。…

重讀生成概率模型1----基礎概念

1 KL 散度 KL 散度的作為是描述兩個分布的差異的&#xff0c;首先是度量一個分布&#xff0c;用熵來度量。 1.1 熵 在介紹熵之間&#xff0c;首先要度量單個事件的信息量 I(x)?logP(x)I(x)-logP(x)I(x)?logP(x) 整體的信息量 H(P)Ex P[?logP(x)]?∑P(x)logP(x) \begin{alig…

排查解決磁盤占用高問題(容器掛載的磁盤)

最近遇到磁盤占用高的告警&#xff0c;記錄一下解決的思路。 首先是系統觸發告警&#xff0c;通知我們某臺機器磁盤占用高。&#xff08;或其他途徑得知&#xff09; 通過XShell登錄該機器。 執行df-h命令查看掛載占用情況找到真正占用高的掛載點掛載點/home目錄占用高&#xf…

流體(1)

流體 Minecraft 中的流體(Fluid),也常被稱為液體(Liquid),是一類能夠自由流動、形成河流、瀑布或湖泊的特殊方塊。它們的行為基于簡化的流體力學,是游戲世界中動態環境的重要組成部分。 ?? 流體是什么? 在 Minecraft 中,流體核心特點包括: 源方塊與流動:每個流…

機器學習-卷積神經網絡(CNN)

全連接層->卷積層 用有一個隱藏層的MLP訓練ImageNet數據集&#xff08;300*300的圖像&#xff0c;有1000個類別&#xff09;&#xff0c;要有10000個輸出 會有10億個可學習的參數&#xff0c;量太大 全連接&#xff1a;一個輸出是根據所有輸入加權得到在圖片中識別物體&…

Ubuntu 磁盤擴容與擴容失敗問題解決( df -h 與 GParted 顯示空間不一致的問題 -LVM)

在管理 Linux 磁盤時&#xff0c;你是否遇到過這樣的困惑&#xff1a;正常擴容之后&#xff0c;發現GParted 顯示某個分區還有幾十 GiB 可用&#xff0c;但 df -h 卻提示該分區已接近滿額&#xff1f;這種 “空間幻覺” 背后是系統存儲管理的分層設計&#xff0c;本文將從原理到…

PyQt5中QLineEdit控件數值顯示與小數位數控制

在PyQt5應用程序開發中&#xff0c;QLineEdit控件常用于顯示和編輯文本內容。當需要用它來顯示數值并控制小數位數時&#xff0c;開發者需要掌握一些特定的技巧。本文將深入探討幾種實現方法&#xff0c;每種方法都附帶完整獨立的代碼示例。 數值格式化基礎 在Python中&#xf…

LangChain使用方法以OpenAI 的聊天模型GPT-4o為例

以使用 OpenAI 的聊天模型&#xff08;如 GPT-4&#xff09;為例&#xff0c;從設置環境、初始化模型、調用模型到處理響應的各個方面進行介紹&#xff1a; 1. 環境設置 安裝 langchain-openai 包。設置環境變量 OPENAI_API_KEY&#xff0c;用于認證&#xff08;以linux為例&am…

Oracle為數據大表創建索引方案

在日常業務中&#xff0c;避免不了為數據量大表補充創建索引的情況&#xff0c;如果快速、有效地創建索引成了一個至關重要的問題&#xff08;注意&#xff1a;雖然提供有ONLINE在線執行的方式&#xff0c;理想狀態下不會阻塞DML操作&#xff0c;但ONLINE在開始、結束的兩個時刻…

網站服務相關問題

目錄 HTTP常見的狀態碼 http和https的區別以及使用的端口號 http處理請求的過程 https認證過程 正向代理和反向代理的區別 HTTP常見的狀態碼 HTTP&#xff08;超文本傳輸協議&#xff09;定義了一系列的狀態碼&#xff0c;用于表示客戶端請求的處理結果。以下是一些常見的…

Go并發編程實戰:深入理解Goroutine與Channel

Go并發編程實戰&#xff1a;深入理解Goroutine與ChannelGo并發編程實戰&#xff1a;深入理解Goroutine與Channel概述1. 為什么是Go的并發&#xff1f;從“線程”與“協程”說起2. Goroutine&#xff1a;如何使用&#xff1f;3. Channel&#xff1a;Goroutine間的安全通信創建與…

2025服貿會“海淀之夜”,點亮“科技”與“服務”底色

2025年9月12日傍晚&#xff0c;北京頤和園&#xff0c;十七孔橋旁&#xff0c;2025年中國國際服務貿易交易會“海淀之夜”如約而至。在“海淀之夜”&#xff0c;科技機構、金融機構、咨詢服務機構、出海服務企業以及跨國企業和國際友人等&#xff0c;將目光聚焦于此。被第三方機…

qt使用camke時,采用vcpkg工具鏈設置VTK的qt模塊QVTKOpenGLNativeWidget

下載:QVTKOpenGLNativeWidget嵌入qt應用中資源-CSDN下載 1.通過vcpkg安裝VTK,目前的VTK里面默認為qt6,如果需要安裝qt5,需要將端口配置進行修改 筆者的vcpkg的vtk端口路徑:D:\vcpkg\ports\vtk portfile.cmake 修改點: #第一處 #file(READ "${CURRENT_INSTALLED_DIR}/sh…