最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL單表約束超詳細(xì)實戰(zhàn)用法(主鍵 / 非空 / 唯一 / 默認(rèn))

 更新時間:2026年03月20日 10:49:41   作者:Westward-sun.  
本文將聚焦 SQL 中的單表約束,詳細(xì)講解主鍵、非空、唯一、默認(rèn)約束的語法格式與實戰(zhàn)用法,結(jié)合案例幫你徹底掌握,讓數(shù)據(jù)更規(guī)范,感興趣的朋友跟隨小編一起看看吧

一、前言

在前幾篇文章中,我們系統(tǒng)學(xué)習(xí)了 SQL 的 DDL、DML 和 DQL 核心用法,掌握了數(shù)據(jù)庫、表、數(shù)據(jù)的增刪改查。但在實際開發(fā)中,僅靠數(shù)據(jù)類型無法保證數(shù)據(jù)的完整性和有效性 —— 比如學(xué)號不能為空且不能重復(fù)、姓名必須填寫、手機號不能重復(fù)等,這就需要約束(Constraint) 來實現(xiàn)。

本文將聚焦 SQL 中的單表約束,詳細(xì)講解主鍵、非空、唯一、默認(rèn)約束的語法格式與實戰(zhàn)用法,結(jié)合案例幫你徹底掌握,讓數(shù)據(jù)更規(guī)范!

二、約束基礎(chǔ)認(rèn)知

2.1 約束概述

約束是在數(shù)據(jù)類型基礎(chǔ)上,對數(shù)據(jù)表中列的值進行進一步的限定,目的是保證數(shù)據(jù)的完整性、唯一性、有效性,避免臟數(shù)據(jù)產(chǎn)生。

2.2 約束分類

表格

約束類型作用域具體約束核心特點
單表約束單張表內(nèi)primary key(主鍵約束)非空 + 唯一,可結(jié)合 auto_increment 自增
not null(非空約束)列值不能為 NULL
unique(唯一約束)列值必須唯一,可 NULL
default(默認(rèn)約束)未賦值時使用默認(rèn)值
多表約束多張表間foreign key(外鍵約束)關(guān)聯(lián)多表,保證數(shù)據(jù)一致性(后續(xù)單獨講解)

三、核心約束實戰(zhàn)(單表約束)

3.1 環(huán)境準(zhǔn)備

-- 重置演示數(shù)據(jù)庫(避免干擾)
DROP DATABASE IF EXISTS day02;
CREATE DATABASE day02;
USE day02;

?? 執(zhí)行效果:刪除已存在的 day02 數(shù)據(jù)庫,重新創(chuàng)建并切換到該數(shù)據(jù)庫。

3.2 主鍵約束(primary key)★★★

3.2.1 主鍵約束核心特點

  • 非空(NOT NULL):主鍵列的值不能為 NULL;
  • 唯一(UNIQUE):主鍵列的值不能重復(fù);
  • 標(biāo)識性:通常用于唯一標(biāo)識表中的一條記錄(如學(xué)號、員工 ID);
  • 自增配合:一般結(jié)合 auto_increment(自增)使用,簡化數(shù)據(jù)插入。

3.2.2 主鍵約束語法格式

表格

應(yīng)用場景語法格式說明
建表時列級定義列名 數(shù)據(jù)類型 PRIMARY KEY直接在列后添加,簡潔常用
建表時表級定義PRIMARY KEY (列名 1, 列名 2...)支持復(fù)合主鍵(多列聯(lián)合主鍵)
建表后添加ALTER TABLE 表名 ADD PRIMARY KEY (列名);適用于已有表補充主鍵
刪除主鍵ALTER TABLE 表名 DROP PRIMARY KEY;單表僅能有一個主鍵,刪除無需指定列名
添加自增ALTER TABLE 表名 MODIFY 列名 數(shù)據(jù)類型 AUTO_INCREMENT;自增僅支持整型列,且需綁定主鍵

3.2.3 實操案例

場景 1:建表時添加主鍵約束

-- 創(chuàng)建學(xué)生表(sid:學(xué)號,主鍵;name:姓名;age:年齡)
DROP TABLE IF EXISTS student;
CREATE TABLE student(
    sid INT PRIMARY KEY,    -- 方式1:列級定義主鍵(推薦)
    name VARCHAR(10),       
    age INT
    -- PRIMARY KEY(sid)    -- 方式2:表級定義主鍵(效果相同)
);

?? 執(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ù)據(jù)
INSERT INTO student VALUES(1, '張三', 18); -- 正常插入

?? 執(zhí)行效果:成功插入 1 條數(shù)據(jù),sid=1、name = 張三、age=18。

INSERT INTO student VALUES(1, '張三', 18); -- 報錯:主鍵重復(fù)(Duplicate entry)

?? 執(zhí)行效果:執(zhí)行報錯,提示「Duplicate entry '1' for key'student.PRIMARY'」,主鍵值不能重復(fù)。

INSERT INTO student VALUES(NULL, '張三', 18); -- 報錯:主鍵非空(Column 'sid' cannot be null)

?? 執(zhí)行效果:執(zhí)行報錯,提示「Column'sid' cannot be null」,主鍵列不能為 NULL。

-- 查看數(shù)據(jù)
SELECT * FROM student;

?? 執(zhí)行效果:僅展示 sid=1 的那條學(xué)生數(shù)據(jù)。

場景 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); -- 報錯:主鍵重復(fù)

?? 執(zhí)行效果:執(zhí)行報錯,主鍵值 2 已存在,無法重復(fù)插入。

INSERT INTO student VALUES(NULL, '李四', 20); -- 正常插入(sid自動遞增為3)

?? 執(zhí)行效果:成功插入數(shù)據(jù),sid 自動遞增為 3。

INSERT INTO student VALUES(10, '王五', 20); -- 插入sid=10

?? 執(zhí)行效果:成功插入 sid=10 的王五數(shù)據(jù)。

INSERT INTO student VALUES(NULL, '趙六', 66); -- sid自動遞增為11

?? 執(zhí)行效果:成功插入數(shù)據(jù),sid 自動遞增為 11(基于上一個最大值 10)。

-- 查看最終數(shù)據(jù)
SELECT * FROM student;

?? 執(zhí)行效果:展示 sid 為 1、2、3、10、11 的 5 條學(xué)生數(shù)據(jù)。

場景 3:實際開發(fā)推薦寫法(建表時直接加主鍵 + 自增)

-- 重建學(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ù)據(jù)(主鍵列傳NULL即可自動遞增)
INSERT INTO student VALUES(NULL, '喬峰', 38);
INSERT INTO student VALUES(NULL, '虛竹', 30);

?? 執(zhí)行效果:成功插入 2 條數(shù)據(jù),sid 自動遞增為 1、2。

-- 查看數(shù)據(jù)
SELECT * FROM student;

?? 執(zhí)行效果:展示 sid=1(喬峰)、sid=2(虛竹)的兩條數(shù)據(jù)。

關(guān)鍵補充:DELETE vs TRUNCATE 對主鍵自增的影響

表格

操作語法格式對主鍵自增的影響本質(zhì)
DELETEDELETE FROM 表名;不重置自增 ID僅刪除數(shù)據(jù)行
TRUNCATETRUNCATE TABLE 表名;重置自增 ID 為 1刪表后重建同名表
-- DELETE:刪除數(shù)據(jù),不重置主鍵自增ID
DELETE FROM student;
INSERT INTO student VALUES(NULL, '段譽', 25); -- sid會從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ù)時 sid 從 1 開始。

3.3 非空 / 唯一 / 默認(rèn)約束(not null/unique/default)

3.3.1 核心特點與語法格式

表格

約束類型語法格式核心規(guī)則
not null

建表時:列名 數(shù)據(jù)類型 NOT NULL

建表后添加:ALTER TABLE 表名 MODIFY 列名 類型 NOT NULL

建表后刪除:ALTER TABLE 表名 MODIFY 列名 類型 NULL

列值必須填寫,不能為 NULL
unique

建表時:列名 數(shù)據(jù)類型 UNIQUE

建表后添加:ALTER TABLE 表名 ADD UNIQUE (列名)

建表后刪除:ALTER TABLE 表名 DROP INDEX 列名

列值必須唯一,可 NULL(多個 NULL 不沖突)
default

建表時:列名 數(shù)據(jù)類型 DEFAULT ' 默認(rèn)值'

建表后添加:ALTER TABLE 表名 MODIFY 列名 類型 DEFAULT ' 默認(rèn)值'

插入數(shù)據(jù)時未賦值,則使用默認(rèn)值

3.3.2 實操案例

-- 創(chuàng)建員工表(整合非空、唯一、默認(rèn)約束)
CREATE TABLE employee(
    eid INT PRIMARY KEY AUTO_INCREMENT,     -- 員工ID:主鍵+自增
    name VARCHAR(10) NOT NULL,              -- 姓名:非空約束
    mobile VARCHAR(11) UNIQUE,              -- 手機號:唯一約束
    address VARCHAR(50) DEFAULT '北京'      -- 住址:默認(rèn)約束(默認(rèn)值為北京)
);

?? 執(zhí)行效果:創(chuàng)建 employee 表,為不同字段分別設(shè)置主鍵 + 自增、非空、唯一、默認(rèn)約束。

-- 查看表結(jié)構(gòu)(可看到對應(yīng)約束標(biāo)識)
DESC employee;

?? 執(zhí)行效果:展示 employee 表結(jié)構(gòu),name 列 Null 顯示「NO」(非空),mobile 列 Key 顯示「UNI」(唯一),address 列 Default 顯示「北京」。

-- 插入測試數(shù)據(jù)
-- 案例1:正常插入(所有字段賦值)
INSERT INTO employee VALUES(NULL, '喬峰', '13800138000', '南院大王府');

?? 執(zhí)行效果:成功插入 1 條員工數(shù)據(jù),eid 自動遞增為 1。

-- 案例2:姓名為空(報錯:非空約束)
-- INSERT INTO employee VALUES(NULL, NULL, '13800138001', '縹緲峰');

?? 執(zhí)行效果:執(zhí)行報錯,提示「Column 'name' cannot be null」,非空約束生效。

-- 案例3:手機號重復(fù)(報錯:唯一約束)
-- INSERT INTO employee VALUES(NULL, '喬峰', '13800138000', '縹緲峰');

?? 執(zhí)行效果:執(zhí)行報錯,提示「Duplicate entry '13800138000' for key 'employee.mobile'」,唯一約束生效。

-- 案例4:手機號不重復(fù),正常插入
INSERT INTO employee VALUES(NULL, '阿紫', '13800138001', '星宿海');

?? 執(zhí)行效果:成功插入 1 條數(shù)據(jù),eid 自動遞增為 2。

-- 案例5:未指定列名,值個數(shù)不足(報錯)
-- INSERT INTO employee VALUES(NULL, '段譽', '13800138002');

?? 執(zhí)行效果:執(zhí)行報錯,提示「Column count doesn't match value count」,字段數(shù)量不匹配。

-- 案例6:指定列插入,住址使用默認(rèn)值
INSERT INTO employee(eid, name, mobile) VALUES(NULL, '段譽', '13800138002');

?? 執(zhí)行效果:成功插入數(shù)據(jù),address 列自動填充默認(rèn)值「北京」,eid 遞增為 3。

-- 查看最終數(shù)據(jù)(段譽的address會顯示默認(rèn)值“北京”)
SELECT * FROM employee;

?? 執(zhí)行效果:展示 3 條員工數(shù)據(jù),段譽的 address 字段值為「北京」(默認(rèn)值)。

四、約束實操避坑指南

  1. 主鍵自增注意:自增列只能是整型,且一張表只能有一個自增列(通常和主鍵綁定);
  2. 唯一約束與 NULL:unique 約束允許多個 NULL 值(因為 NULL 不等于任何值);
  3. 默認(rèn)約束生效條件:僅當(dāng)插入數(shù)據(jù)時未給該列賦值,才會使用默認(rèn)值;

約束修改 / 刪除速查表

表格

操作語法示例
刪除主鍵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é)

核心要點回顧

  1. 約束是對列值的額外限定,單表約束核心包括主鍵、非空、唯一、默認(rèn),均有明確的語法格式;
  2. 主鍵約束是最核心的單表約束,具備非空 + 唯一特性,結(jié)合 auto_increment 可自動遞增,建表時「列名 類型 PRIMARY KEY」是最常用寫法;
  3. not null 強制列值非空,unique 強制列值唯一,default 為列設(shè)置默認(rèn)值,三者均支持建表時定義、建表后修改;
  4. DELETE 刪除數(shù)據(jù)不重置主鍵自增,TRUNCATE 會重置(刪表重建)。

下一步學(xué)習(xí)預(yù)告

本文掌握了單表約束的語法格式與核心用法,后續(xù)將講解多表約束(外鍵約束) 和多表查詢,這是 SQL 進階的關(guān)鍵,關(guān)注我,持續(xù)解鎖 SQL 實戰(zhàn)技能!

拓展練習(xí)

  1. 創(chuàng)建一張商品表(goods),按格式定義字段:
    • 商品 ID(gid):INT 類型,主鍵 + 自增;
    • 商品名(gname):VARCHAR (20),非空約束;
    • 商品編號(gcode):VARCHAR (32),唯一約束;
    • 庫存(stock):INT,默認(rèn)約束(默認(rèn)值 0);
    • 分類 ID(cid):VARCHAR (32);
  2. 向商品表插入 5 條測試數(shù)據(jù),驗證各約束是否生效;
  3. 使用 ALTER 語句給商品表添加 “單價(price)” 字段,設(shè)置為 DECIMAL (10,2) 類型,默認(rèn)值 0.00。

關(guān)鍵點回顧

  1. 主鍵約束核心是「非空 + 唯一」,結(jié)合自增可簡化主鍵賦值,是單表最核心的約束;
  2. 非空約束強制字段必填,唯一約束保證字段值不重復(fù)(允許 NULL),默認(rèn)約束在未賦值時填充默認(rèn)值;
  3. 約束支持建表時定義、建表后修改 / 刪除,不同約束的操作語法需區(qū)分記憶。

到此這篇關(guān)于MySQL單表約束超詳細(xì)實戰(zhàn)用法(主鍵 / 非空 / 唯一 / 默認(rèn))的文章就介紹到這了,更多相關(guān)mysql單表約束內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

上杭县| 丰宁| 铅山县| 怀安县| 阿拉善盟| 都江堰市| 通道| 贵港市| 白玉县| 海南省| 南宁市| 六安市| 温州市| 陇南市| 定日县| 南陵县| 临沂市| 辽宁省| 上栗县| 邢台县| 红安县| 阜新| 蕉岭县| 嘉义县| 临海市| 普定县| 手游| 浑源县| 海伦市| 建湖县| 岚皋县| 岑溪市| 伊川县| 曲沃县| 揭东县| 佛教| 武陟县| 南充市| 叶城县| 壶关县| 凤台县|