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

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

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

一、前言

在前幾篇文章中,我們系統(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ì)
DELETEDELETE FROM 表名;不重置自增 ID僅刪除數(shù)據(jù)行
TRUNCATETRUNCATE 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í)操避坑指南

  1. 主鍵自增注意:自增列只能是整型,且一張表只能有一個(gè)自增列(通常和主鍵綁定);
  2. 唯一約束與 NULL:unique 約束允許多個(gè) NULL 值(因?yàn)?NULL 不等于任何值);
  3. 默認(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)回顧

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

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

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

拓展練習(xí)

  1. 創(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);
  2. 向商品表插入 5 條測(cè)試數(shù)據(jù),驗(yàn)證各約束是否生效;
  3. 使用 ALTER 語(yǔ)句給商品表添加 “單價(jià)(price)” 字段,設(shè)置為 DECIMAL (10,2) 類型,默認(rèn)值 0.00。

關(guān)鍵點(diǎn)回顧

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

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

相關(guān)文章

最新評(píng)論

蒙阴县| 东乡族自治县| 关岭| 汉源县| 闽清县| 巴彦县| 海伦市| 大洼县| 庆安县| 邹平县| 济宁市| 西吉县| 霸州市| 正镶白旗| 阿拉尔市| 陆河县| 白城市| 晋江市| 嘉义市| 得荣县| 澄城县| 达孜县| 日土县| 安顺市| 宁明县| 睢宁县| 类乌齐县| 巴东县| 合水县| 镇坪县| 武威市| 察隅县| 明水县| 玉树县| 宜川县| 长阳| 广灵县| 开远市| 探索| 谷城县| 茶陵县|