一文系統(tǒng)梳理MySQL數(shù)據(jù)庫(kù)中表的約束
今天這篇博客,我把 MySQL 里表的約束從頭到尾梳理一遍,全部是面試、開發(fā)高頻考點(diǎn),配案例、配語(yǔ)法、配易錯(cuò)點(diǎn),看完直接能用在項(xiàng)目里。
一、什么是表約束?為什么要用?
數(shù)據(jù)類型只能做最基礎(chǔ)的限制,但業(yè)務(wù)里要求更嚴(yán)格:比如郵箱不能重復(fù)、姓名不能為空、學(xué)號(hào)必須唯一、成績(jī)不能為負(fù)……
約束 = 給字段加 “規(guī)則”,從業(yè)務(wù)層面保證數(shù)據(jù)合法、正確、不混亂。
MySQL 常用約束一共 8 個(gè):NULL / NOT NULL、DEFAULT、COMMENT、ZEROFILL、PRIMARY KEY、AUTO_INCREMENT、UNIQUE KEY、FOREIGN KEY。
二、空屬性:NULL / NOT NULL
作用
控制字段是否允許為空。
NULL:允許為空(默認(rèn))NOT NULL:不允許為空
關(guān)鍵點(diǎn)
- 空值無(wú)法參與運(yùn)算:
1 + NULL = NULL - 實(shí)際開發(fā)盡量用
NOT NULL,數(shù)據(jù)更可靠
示例
CREATE TABLE myclass(
class_name VARCHAR(20) NOT NULL,
class_room VARCHAR(10) NOT NULL
);
插入時(shí)缺了 class_room 直接報(bào)錯(cuò):
ERROR 1364 : Field 'class_room' doesn't have a default value
三、默認(rèn)值:DEFAULT
作用
插入數(shù)據(jù)時(shí)不指定該字段,自動(dòng)使用預(yù)設(shè)值。
示例
CREATE TABLE tt10 (
name VARCHAR(20) NOT NULL,
age TINYINT UNSIGNED DEFAULT 0,
sex CHAR(2) DEFAULT '男'
);
只插 name,age=0、sex = 男 自動(dòng)填充:
INSERT INTO tt10(name) VALUES('zhangsan');
四、列描述:COMMENT
作用
給字段加注釋說(shuō)明,方便團(tuán)隊(duì)維護(hù)。
示例
CREATE TABLE tt12 (
name VARCHAR(20) NOT NULL COMMENT '姓名',
age TINYINT UNSIGNED DEFAULT 0 COMMENT '年齡'
);
查看注釋
SHOW CREATE TABLE tt12\G
五、零填充:ZEROFILL
作用
數(shù)字不足指定位數(shù)時(shí),前面補(bǔ) 0,只影響顯示,不影響存儲(chǔ)。
示例
ALTER TABLE tt3 CHANGE a a INT(5) UNSIGNED ZEROFILL;
插入 1 → 顯示 00001,實(shí)際存儲(chǔ)還是 1。
六、主鍵:PRIMARY KEY
作用
唯一標(biāo)識(shí)一行數(shù)據(jù),約束最強(qiáng):
- 不能重復(fù)
- 不能為空
- 一張表最多一個(gè)主鍵
示例
CREATE TABLE tt13 (
id INT UNSIGNED PRIMARY KEY COMMENT '學(xué)號(hào)',
name VARCHAR(20) NOT NULL
);
復(fù)合主鍵
多個(gè)字段一起做主鍵,組合唯一:
CREATE TABLE tt14(
id INT UNSIGNED,
course CHAR(10),
PRIMARY KEY(id, course)
);
追加 / 刪除主鍵
ALTER TABLE 表 ADD PRIMARY KEY(字段); ALTER TABLE 表 DROP PRIMARY KEY;
七、自增長(zhǎng):AUTO_INCREMENT
作用
字段不賦值時(shí)自動(dòng) + 1,通常配合主鍵使用。
特點(diǎn)
- 必須是索引列
- 必須是整數(shù)
- 一張表最多一個(gè)自增
示例
CREATE TABLE tt21(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(10) NOT NULL DEFAULT ''
);
獲取剛插入的自增 ID
SELECT LAST_INSERT_ID();
八、唯一鍵:UNIQUE KEY
作用
保證字段業(yè)務(wù)不重復(fù),但允許為 NULL。
主鍵 vs 唯一鍵
- 主鍵:不能為空,一張表一個(gè)
- 唯一鍵:可以為空,一張表多個(gè)
示例
CREATE TABLE student (
id CHAR(10) UNIQUE COMMENT '學(xué)號(hào)',
name VARCHAR(10)
);
九、外鍵:FOREIGN KEY
作用
約束表與表之間的關(guān)系,保證數(shù)據(jù)邏輯一致。
規(guī)則:
- 從表外鍵的值 必須在主表主鍵里存在
- 或?yàn)?NULL
示例
先建主表(班級(jí)):
CREATE TABLE myclass (
id INT PRIMARY KEY,
name VARCHAR(30) NOT NULL
);
再建從表(學(xué)生):
CREATE TABLE stu (
id INT PRIMARY KEY,
name VARCHAR(30) NOT NULL,
class_id INT,
FOREIGN KEY (class_id) REFERENCES myclass(id)
);
插入不存在的班級(jí) ID 直接報(bào)錯(cuò),保證數(shù)據(jù)不亂。
十、綜合實(shí)戰(zhàn):商城三表設(shè)計(jì)(高頻面試題)
商品表、客戶表、訂單表,一次寫完主外鍵 + 所有約束:
CREATE DATABASE IF NOT EXISTS mall DEFAULT CHARSET utf8;
USE mall;
-- 商品表
CREATE TABLE goods(
goods_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '商品ID',
goods_name VARCHAR(32) NOT NULL COMMENT '商品名',
unitprice INT NOT NULL DEFAULT 0 COMMENT '單價(jià)(分)',
category VARCHAR(12) COMMENT '類別',
provider VARCHAR(64) NOT NULL COMMENT '供應(yīng)商'
);
-- 客戶表
CREATE TABLE customer(
customer_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '客戶ID',
name VARCHAR(32) NOT NULL COMMENT '姓名',
address VARCHAR(256) COMMENT '地址',
email VARCHAR(64) UNIQUE COMMENT '郵箱',
sex ENUM('男','女') NOT NULL COMMENT '性別',
card_id CHAR(18) UNIQUE COMMENT '身份證'
);
-- 訂單表
CREATE TABLE purchase(
order_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '訂單ID',
customer_id INT COMMENT '客戶ID',
goods_id INT COMMENT '商品ID',
nums INT DEFAULT 0 COMMENT '數(shù)量',
FOREIGN KEY (customer_id) REFERENCES customer(customer_id),
FOREIGN KEY (goods_id) REFERENCES goods(goods_id)
);
十一、高頻考點(diǎn)速記(面試必背)
NOT NULL不能為空,DEFAULT提供默認(rèn)值COMMENT是注釋,ZEROFILL只補(bǔ) 0 不改變存儲(chǔ)- 主鍵唯一且非空,一張表一個(gè)
- 自增長(zhǎng)必須是整數(shù)、索引列
- 唯一鍵允許 NULL,可建多個(gè)
- 外鍵保證表關(guān)系合法,主表必須有主鍵 / 唯一鍵
十二、MySQL 約束|表結(jié)構(gòu)修改|數(shù)據(jù)修改 終極對(duì)比表
(一眼不混,直接背)
| 分類 | 作用 | 關(guān)鍵字 / 語(yǔ)句 | 示例 |
|---|---|---|---|
| 1. 字段約束(建表用) | 給字段定規(guī)則(不能為空、唯一、默認(rèn)值等) | NOT NULL DEFAULT COMMENT ZERO FILL PRIMARY KEY AUTO_INCREMENT UNIQUE KEY FOREIGN KEY | name VARCHAR(20) NOT NULLage INT DEFAULT 0id INT PRIMARY KEY AUTO_INCREMENT |
| 2. 修改表結(jié)構(gòu)(ALTER) | 改表:加字段、刪字段、改約束、加主鍵 | ALTER TABLE 表ADD(添加)DROP(刪除)MODIFY(改類型 / 約束)CHANGE(改名 + 改類型) | ALTER TABLE t ADD PRIMARY KEY(id);ALTER TABLE t MODIFY name NOT NULL; |
| 3. 修改表中數(shù)據(jù) | 改表里的內(nèi)容:增 / 刪 / 改記錄 | INSERT(插入)UPDATE(修改)DELETE(刪除) | INSERT INTO t VALUES (1,' 張三 ');UPDATE t SET name=' 李四 ' WHERE id=1;DELETE FROM t WHERE id=1; |
最核心記憶口訣(背會(huì)永不混)
- 約束:管字段規(guī)則(NOT NULL / PRIMARY KEY 等)
- ALTER:管表結(jié)構(gòu)(加字段、改約束、加主鍵)
- INSERT / UPDATE / DELETE:管表里的數(shù)據(jù)
十三、結(jié)束語(yǔ)
MySQL 約束看似多,其實(shí)邏輯非常統(tǒng)一:都是為了管住數(shù)據(jù),不讓臟數(shù)據(jù)進(jìn)庫(kù)。開發(fā)時(shí)先想清楚字段規(guī)則,再建表,后面少填無(wú)數(shù)坑。
以上就是一文系統(tǒng)梳理MySQL數(shù)據(jù)庫(kù)中表的約束的詳細(xì)內(nèi)容,更多關(guān)于MySQL表約束的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Django創(chuàng)建項(xiàng)目+連通mysql的操作方法
這篇文章主要介紹了Django創(chuàng)建項(xiàng)目+連通mysql的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
MySQL定時(shí)刪除XX天數(shù)據(jù)示例代碼
通過(guò)使用MySQL的事件調(diào)度器,我們可以方便地創(chuàng)建定時(shí)任務(wù)來(lái)定期清理數(shù)據(jù)庫(kù)中的過(guò)期數(shù)據(jù),本文介紹了如何創(chuàng)建定時(shí)任務(wù)以及如何刪除3個(gè)月前的數(shù)據(jù)作為示例,感興趣的朋友跟隨小編一起看看吧2023-09-09
如何使用mysql查詢24小時(shí)數(shù)據(jù)
在進(jìn)行實(shí)時(shí)數(shù)據(jù)處理時(shí),我們常常需要查詢最近24小時(shí)的數(shù)據(jù)來(lái)進(jìn)行分析和處理,下面我們將介紹如何使用MySQL查詢最近24小時(shí)的數(shù)據(jù),需要的朋友可以參考下2023-07-07
mysql8.0忘記密碼修改與net命令服務(wù)名無(wú)效問題
這篇文章主要介紹了mysql8.0忘記密碼修改與net命令服務(wù)名無(wú)效的問題與解決方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12
MySQL數(shù)據(jù)庫(kù)定時(shí)備份的實(shí)現(xiàn)方法
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)的定時(shí)備份的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
詳解mysql的limit經(jīng)典用法及優(yōu)化實(shí)例
這篇文章詳細(xì)介紹了mysql的limit經(jīng)典用法及優(yōu)化實(shí)例,有需要的朋友可以參考一下2013-09-09

