MySQL單表約束超詳細(xì)實(shí)戰(zhàn)用法(主鍵 / 非空 / 唯一 / 默認(rèn))
一、前言
在前幾篇文章中,我們系統(tǒng)學(xué)習(xí)了 SQL 的 DDL、DML 和 DQL 核心用法,掌握了數(shù)據(jù)庫(kù)、表、數(shù)據(jù)的增刪改查。但在實(shí)際開發(fā)中,僅靠數(shù)據(jù)類型無(wú)法保證數(shù)據(jù)的完整性和有效性 —— 比如學(xué)號(hào)不能為空且不能重復(fù)、姓名必須填寫、手機(jī)號(hào)不能重復(fù)等,這就需要約束(Constraint) 來(lái)實(shí)現(xiàn)。
本文將聚焦 SQL 中的單表約束,詳細(xì)講解主鍵、非空、唯一、默認(rèn)約束的語(yǔ)法格式與實(shí)戰(zhàn)用法,結(jié)合案例幫你徹底掌握,讓數(shù)據(jù)更規(guī)范!
二、約束基礎(chǔ)認(rèn)知
2.1 約束概述
約束是在數(shù)據(jù)類型基礎(chǔ)上,對(duì)數(shù)據(jù)表中列的值進(jìn)行進(jìn)一步的限定,目的是保證數(shù)據(jù)的完整性、唯一性、有效性,避免臟數(shù)據(jù)產(chǎn)生。
2.2 約束分類
表格
| 約束類型 | 作用域 | 具體約束 | 核心特點(diǎn) |
|---|---|---|---|
| 單表約束 | 單張表內(nèi) | primary key(主鍵約束) | 非空 + 唯一,可結(jié)合 auto_increment 自增 |
| not null(非空約束) | 列值不能為 NULL | ||
| unique(唯一約束) | 列值必須唯一,可 NULL | ||
| default(默認(rèn)約束) | 未賦值時(shí)使用默認(rèn)值 | ||
| 多表約束 | 多張表間 | foreign key(外鍵約束) | 關(guān)聯(lián)多表,保證數(shù)據(jù)一致性(后續(xù)單獨(dú)講解) |
三、核心約束實(shí)戰(zhàn)(單表約束)
3.1 環(huán)境準(zhǔn)備
-- 重置演示數(shù)據(jù)庫(kù)(避免干擾) DROP DATABASE IF EXISTS day02; CREATE DATABASE day02; USE day02;
?? 執(zhí)行效果:刪除已存在的 day02 數(shù)據(jù)庫(kù),重新創(chuàng)建并切換到該數(shù)據(jù)庫(kù)。
3.2 主鍵約束(primary key)★★★
3.2.1 主鍵約束核心特點(diǎn)
- 非空(NOT NULL):主鍵列的值不能為 NULL;
- 唯一(UNIQUE):主鍵列的值不能重復(fù);
- 標(biāo)識(shí)性:通常用于唯一標(biāo)識(shí)表中的一條記錄(如學(xué)號(hào)、員工 ID);
- 自增配合:一般結(jié)合
auto_increment(自增)使用,簡(jiǎn)化數(shù)據(jù)插入。
3.2.2 主鍵約束語(yǔ)法格式
表格
| 應(yīng)用場(chǎng)景 | 語(yǔ)法格式 | 說(shuō)明 |
|---|---|---|
| 建表時(shí)列級(jí)定義 | 列名 數(shù)據(jù)類型 PRIMARY KEY | 直接在列后添加,簡(jiǎn)潔常用 |
| 建表時(shí)表級(jí)定義 | PRIMARY KEY (列名 1, 列名 2...) | 支持復(fù)合主鍵(多列聯(lián)合主鍵) |
| 建表后添加 | ALTER TABLE 表名 ADD PRIMARY KEY (列名); | 適用于已有表補(bǔ)充主鍵 |
| 刪除主鍵 | ALTER TABLE 表名 DROP PRIMARY KEY; | 單表僅能有一個(gè)主鍵,刪除無(wú)需指定列名 |
| 添加自增 | ALTER TABLE 表名 MODIFY 列名 數(shù)據(jù)類型 AUTO_INCREMENT; | 自增僅支持整型列,且需綁定主鍵 |
3.2.3 實(shí)操案例
場(chǎng)景 1:建表時(shí)添加主鍵約束
-- 創(chuàng)建學(xué)生表(sid:學(xué)號(hào),主鍵;name:姓名;age:年齡)
DROP TABLE IF EXISTS student;
CREATE TABLE student(
sid INT PRIMARY KEY, -- 方式1:列級(jí)定義主鍵(推薦)
name VARCHAR(10),
age INT
-- PRIMARY KEY(sid) -- 方式2:表級(jí)定義主鍵(效果相同)
);?? 執(zhí)行效果:刪除已存在的 student 表,創(chuàng)建新表并將 sid 列設(shè)為主鍵。
-- 查看表結(jié)構(gòu)(可看到sid的Key列顯示PRI,代表主鍵) DESC student;
?? 執(zhí)行效果:展示 student 表的字段結(jié)構(gòu),sid 字段的 Key 列顯示「PRI」,標(biāo)識(shí)為主鍵。
-- 插入測(cè)試數(shù)據(jù) INSERT INTO student VALUES(1, '張三', 18); -- 正常插入
?? 執(zhí)行效果:成功插入 1 條數(shù)據(jù),sid=1、name = 張三、age=18。
INSERT INTO student VALUES(1, '張三', 18); -- 報(bào)錯(cuò):主鍵重復(fù)(Duplicate entry)
?? 執(zhí)行效果:執(zhí)行報(bào)錯(cuò),提示「Duplicate entry '1' for key'student.PRIMARY'」,主鍵值不能重復(fù)。
INSERT INTO student VALUES(NULL, '張三', 18); -- 報(bào)錯(cuò):主鍵非空(Column 'sid' cannot be null)
?? 執(zhí)行效果:執(zhí)行報(bào)錯(cuò),提示「Column'sid' cannot be null」,主鍵列不能為 NULL。
-- 查看數(shù)據(jù) SELECT * FROM student;
?? 執(zhí)行效果:僅展示 sid=1 的那條學(xué)生數(shù)據(jù)。
場(chǎng)景 2:建表后添加主鍵 + 自增
-- 先刪除已有的主鍵約束 ALTER TABLE student DROP PRIMARY KEY;
?? 執(zhí)行效果:成功刪除 student 表的主鍵約束。
-- 重新添加主鍵約束,并增加自增功能 ALTER TABLE student ADD PRIMARY KEY(sid); ALTER TABLE student MODIFY sid INT AUTO_INCREMENT;
?? 執(zhí)行效果:為 sid 列重新添加主鍵約束,并開啟自增特性。
-- 再次插入數(shù)據(jù)(自增特性生效) INSERT INTO student VALUES(2, '李四', 20); -- 正常插入
?? 執(zhí)行效果:成功插入 sid=2 的李四數(shù)據(jù)。
INSERT INTO student VALUES(2, '李四', 20); -- 報(bào)錯(cuò):主鍵重復(fù)
?? 執(zhí)行效果:執(zhí)行報(bào)錯(cuò),主鍵值 2 已存在,無(wú)法重復(fù)插入。
INSERT INTO student VALUES(NULL, '李四', 20); -- 正常插入(sid自動(dòng)遞增為3)
?? 執(zhí)行效果:成功插入數(shù)據(jù),sid 自動(dòng)遞增為 3。
INSERT INTO student VALUES(10, '王五', 20); -- 插入sid=10
?? 執(zhí)行效果:成功插入 sid=10 的王五數(shù)據(jù)。
INSERT INTO student VALUES(NULL, '趙六', 66); -- sid自動(dòng)遞增為11
?? 執(zhí)行效果:成功插入數(shù)據(jù),sid 自動(dòng)遞增為 11(基于上一個(gè)最大值 10)。
-- 查看最終數(shù)據(jù) SELECT * FROM student;
?? 執(zhí)行效果:展示 sid 為 1、2、3、10、11 的 5 條學(xué)生數(shù)據(jù)。
場(chǎng)景 3:實(shí)際開發(fā)推薦寫法(建表時(shí)直接加主鍵 + 自增)
-- 重建學(xué)生表(推薦寫法)
DROP TABLE IF EXISTS student;
CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT, -- 主鍵+自增一步到位
name VARCHAR(10),
age INT
);?? 執(zhí)行效果:刪除舊表,創(chuàng)建新表,sid 列同時(shí)設(shè)置為主鍵并開啟自增。
-- 插入數(shù)據(jù)(主鍵列傳NULL即可自動(dòng)遞增) INSERT INTO student VALUES(NULL, '喬峰', 38); INSERT INTO student VALUES(NULL, '虛竹', 30);
?? 執(zhí)行效果:成功插入 2 條數(shù)據(jù),sid 自動(dòng)遞增為 1、2。
-- 查看數(shù)據(jù) SELECT * FROM student;
?? 執(zhí)行效果:展示 sid=1(喬峰)、sid=2(虛竹)的兩條數(shù)據(jù)。
關(guān)鍵補(bǔ)充:DELETE vs TRUNCATE 對(duì)主鍵自增的影響
表格
| 操作 | 語(yǔ)法格式 | 對(duì)主鍵自增的影響 | 本質(zhì) |
|---|---|---|---|
| DELETE | DELETE FROM 表名; | 不重置自增 ID | 僅刪除數(shù)據(jù)行 |
| TRUNCATE | TRUNCATE TABLE 表名; | 重置自增 ID 為 1 | 刪表后重建同名表 |
-- DELETE:刪除數(shù)據(jù),不重置主鍵自增ID DELETE FROM student; INSERT INTO student VALUES(NULL, '段譽(yù)', 25); -- sid會(huì)從3開始(而非1)
?? 執(zhí)行效果:刪除所有數(shù)據(jù)后插入新數(shù)據(jù),sid 從 3 開始(原自增最大值為 2)。
-- TRUNCATE:清空表并重置主鍵自增ID(相當(dāng)于刪表重建) TRUNCATE TABLE student; INSERT INTO student VALUES(NULL, '阿朱', 20); -- sid從1開始
?? 執(zhí)行效果:清空表并重置自增 ID,插入新數(shù)據(jù)時(shí) sid 從 1 開始。
3.3 非空 / 唯一 / 默認(rèn)約束(not null/unique/default)
3.3.1 核心特點(diǎn)與語(yǔ)法格式
表格
| 約束類型 | 語(yǔ)法格式 | 核心規(guī)則 |
|---|---|---|
| not null | 建表時(shí):列名 數(shù)據(jù)類型 NOT NULL 建表后添加:ALTER TABLE 表名 MODIFY 列名 類型 NOT NULL 建表后刪除:ALTER TABLE 表名 MODIFY 列名 類型 NULL | 列值必須填寫,不能為 NULL |
| unique | 建表時(shí):列名 數(shù)據(jù)類型 UNIQUE 建表后添加:ALTER TABLE 表名 ADD UNIQUE (列名) 建表后刪除:ALTER TABLE 表名 DROP INDEX 列名 | 列值必須唯一,可 NULL(多個(gè) NULL 不沖突) |
| default | 建表時(shí):列名 數(shù)據(jù)類型 DEFAULT ' 默認(rèn)值' 建表后添加:ALTER TABLE 表名 MODIFY 列名 類型 DEFAULT ' 默認(rèn)值' | 插入數(shù)據(jù)時(shí)未賦值,則使用默認(rèn)值 |
3.3.2 實(shí)操案例
-- 創(chuàng)建員工表(整合非空、唯一、默認(rèn)約束)
CREATE TABLE employee(
eid INT PRIMARY KEY AUTO_INCREMENT, -- 員工ID:主鍵+自增
name VARCHAR(10) NOT NULL, -- 姓名:非空約束
mobile VARCHAR(11) UNIQUE, -- 手機(jī)號(hào):唯一約束
address VARCHAR(50) DEFAULT '北京' -- 住址:默認(rèn)約束(默認(rèn)值為北京)
);?? 執(zhí)行效果:創(chuàng)建 employee 表,為不同字段分別設(shè)置主鍵 + 自增、非空、唯一、默認(rèn)約束。
-- 查看表結(jié)構(gòu)(可看到對(duì)應(yīng)約束標(biāo)識(shí)) DESC employee;
?? 執(zhí)行效果:展示 employee 表結(jié)構(gòu),name 列 Null 顯示「NO」(非空),mobile 列 Key 顯示「UNI」(唯一),address 列 Default 顯示「北京」。
-- 插入測(cè)試數(shù)據(jù) -- 案例1:正常插入(所有字段賦值) INSERT INTO employee VALUES(NULL, '喬峰', '13800138000', '南院大王府');
?? 執(zhí)行效果:成功插入 1 條員工數(shù)據(jù),eid 自動(dòng)遞增為 1。
-- 案例2:姓名為空(報(bào)錯(cuò):非空約束) -- INSERT INTO employee VALUES(NULL, NULL, '13800138001', '縹緲?lè)?);
?? 執(zhí)行效果:執(zhí)行報(bào)錯(cuò),提示「Column 'name' cannot be null」,非空約束生效。
-- 案例3:手機(jī)號(hào)重復(fù)(報(bào)錯(cuò):唯一約束) -- INSERT INTO employee VALUES(NULL, '喬峰', '13800138000', '縹緲?lè)?);
?? 執(zhí)行效果:執(zhí)行報(bào)錯(cuò),提示「Duplicate entry '13800138000' for key 'employee.mobile'」,唯一約束生效。
-- 案例4:手機(jī)號(hào)不重復(fù),正常插入 INSERT INTO employee VALUES(NULL, '阿紫', '13800138001', '星宿海');
?? 執(zhí)行效果:成功插入 1 條數(shù)據(jù),eid 自動(dòng)遞增為 2。
-- 案例5:未指定列名,值個(gè)數(shù)不足(報(bào)錯(cuò)) -- INSERT INTO employee VALUES(NULL, '段譽(yù)', '13800138002');
?? 執(zhí)行效果:執(zhí)行報(bào)錯(cuò),提示「Column count doesn't match value count」,字段數(shù)量不匹配。
-- 案例6:指定列插入,住址使用默認(rèn)值 INSERT INTO employee(eid, name, mobile) VALUES(NULL, '段譽(yù)', '13800138002');
?? 執(zhí)行效果:成功插入數(shù)據(jù),address 列自動(dòng)填充默認(rèn)值「北京」,eid 遞增為 3。
-- 查看最終數(shù)據(jù)(段譽(yù)的address會(huì)顯示默認(rèn)值“北京”) SELECT * FROM employee;
?? 執(zhí)行效果:展示 3 條員工數(shù)據(jù),段譽(yù)的 address 字段值為「北京」(默認(rèn)值)。
四、約束實(shí)操避坑指南
- 主鍵自增注意:自增列只能是整型,且一張表只能有一個(gè)自增列(通常和主鍵綁定);
- 唯一約束與 NULL:unique 約束允許多個(gè) NULL 值(因?yàn)?NULL 不等于任何值);
- 默認(rèn)約束生效條件:僅當(dāng)插入數(shù)據(jù)時(shí)未給該列賦值,才會(huì)使用默認(rèn)值;
約束修改 / 刪除速查表
表格
| 操作 | 語(yǔ)法示例 |
|---|---|
| 刪除主鍵 | ALTER TABLE student DROP PRIMARY KEY; |
| 添加非空約束 | ALTER TABLE employee MODIFY name VARCHAR(10) NOT NULL; |
| 刪除非空約束 | ALTER TABLE employee MODIFY name VARCHAR(10) NULL; |
| 添加唯一約束 | ALTER TABLE employee ADD UNIQUE(mobile); |
| 刪除唯一約束 | ALTER TABLE employee DROP INDEX mobile; |
| 添加默認(rèn)約束 | ALTER TABLE employee MODIFY address VARCHAR (50) DEFAULT ' 上海 '; |
五、總結(jié)
核心要點(diǎn)回顧
- 約束是對(duì)列值的額外限定,單表約束核心包括主鍵、非空、唯一、默認(rèn),均有明確的語(yǔ)法格式;
- 主鍵約束是最核心的單表約束,具備非空 + 唯一特性,結(jié)合
auto_increment可自動(dòng)遞增,建表時(shí)「列名 類型 PRIMARY KEY」是最常用寫法; not null強(qiáng)制列值非空,unique強(qiáng)制列值唯一,default為列設(shè)置默認(rèn)值,三者均支持建表時(shí)定義、建表后修改;- DELETE 刪除數(shù)據(jù)不重置主鍵自增,TRUNCATE 會(huì)重置(刪表重建)。
下一步學(xué)習(xí)預(yù)告
本文掌握了單表約束的語(yǔ)法格式與核心用法,后續(xù)將講解多表約束(外鍵約束) 和多表查詢,這是 SQL 進(jìn)階的關(guān)鍵,關(guān)注我,持續(xù)解鎖 SQL 實(shí)戰(zhàn)技能!
拓展練習(xí)
- 創(chuàng)建一張商品表(goods),按格式定義字段:
- 商品 ID(gid):INT 類型,主鍵 + 自增;
- 商品名(gname):VARCHAR (20),非空約束;
- 商品編號(hào)(gcode):VARCHAR (32),唯一約束;
- 庫(kù)存(stock):INT,默認(rèn)約束(默認(rèn)值 0);
- 分類 ID(cid):VARCHAR (32);
- 向商品表插入 5 條測(cè)試數(shù)據(jù),驗(yàn)證各約束是否生效;
- 使用 ALTER 語(yǔ)句給商品表添加 “單價(jià)(price)” 字段,設(shè)置為 DECIMAL (10,2) 類型,默認(rèn)值 0.00。
關(guān)鍵點(diǎn)回顧
- 主鍵約束核心是「非空 + 唯一」,結(jié)合自增可簡(jiǎn)化主鍵賦值,是單表最核心的約束;
- 非空約束強(qiáng)制字段必填,唯一約束保證字段值不重復(fù)(允許 NULL),默認(rèn)約束在未賦值時(shí)填充默認(rèn)值;
- 約束支持建表時(shí)定義、建表后修改 / 刪除,不同約束的操作語(yǔ)法需區(qū)分記憶。
到此這篇關(guān)于MySQL單表約束超詳細(xì)實(shí)戰(zhàn)用法(主鍵 / 非空 / 唯一 / 默認(rèn))的文章就介紹到這了,更多相關(guān)mysql單表約束內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
windows下MySQL5.6版本安裝及配置過(guò)程附有截圖和詳細(xì)說(shuō)明
這篇文章主要介紹了windows下MySQL5.6版本安裝及配置過(guò)程附有截圖和詳細(xì)說(shuō)明,需要的朋友可以參考下2013-06-06
詳解MySQL中的存儲(chǔ)過(guò)程和函數(shù)
這篇文章主要為大家詳細(xì)介紹了MySQL數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程和函數(shù)的相關(guān)操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2022-08-08
MySQL數(shù)據(jù)庫(kù)安全秘籍之守護(hù)數(shù)據(jù)金庫(kù)防火防盜防攻擊
MySQL是許多公司和組織的關(guān)鍵數(shù)據(jù)庫(kù),因此其安全性的重要性如此顯而易見,為了確保MySQL的安全性,需要采取多種措施來(lái)增強(qiáng)其安全性,本文給大家介紹MySQL數(shù)據(jù)庫(kù)安全秘籍之守護(hù)數(shù)據(jù)金庫(kù)防火防盜防攻擊,感興趣的朋友一起看看吧2023-03-03
MYSQL使用Union將兩張表的數(shù)據(jù)合并顯示
使用union操作符會(huì)將多張表中相同的數(shù)據(jù)取值一次,如果想將表1和表2中的值完整的顯示出來(lái),可以使用union all,今天通過(guò)本文給大家分享MYSQL使用Union將兩張表的數(shù)據(jù)合并顯示功能,需要的朋友參考下吧2021-08-08
MySQL中無(wú)GROUP BY情況下直接使用HAVING語(yǔ)句的問(wèn)題探究
這篇文章主要介紹了MySQL中無(wú)GROUP BY情況下直接使用HAVING語(yǔ)句的問(wèn)題探究,同時(shí)探究了該情況下MAX與MIN功能的使用情況,需要的朋友可以參考下2015-05-05
解決Navicat Premium 連接 MySQL 8.0 報(bào)錯(cuò)"1251"的問(wèn)題分析
這篇文章主要介紹了解決Navicat Premium 連接 MySQL 8.0 報(bào)錯(cuò)"1251"的問(wèn)題分析,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
一個(gè)小時(shí)學(xué)會(huì)MySQL數(shù)據(jù)庫(kù)(張果)
當(dāng)前大量的網(wǎng)站使用php語(yǔ)言,那么對(duì)應(yīng)的就是mysql數(shù)據(jù)庫(kù),這里就為大家分享一下MySQL數(shù)據(jù)庫(kù)的相關(guān)知識(shí),希望大家多多支持腳本之家2018-01-01
將.sql文件導(dǎo)入到MySQL數(shù)據(jù)庫(kù)具體步驟
MySQL有多種方法導(dǎo)入多個(gè).sql文件,下面這篇文章主要介紹了將.sql文件導(dǎo)入到MySQL數(shù)據(jù)庫(kù)的具體步驟,文中將實(shí)現(xiàn)步驟介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10

