一文系統(tǒng)梳理MySQL數(shù)據(jù)庫中表的約束
今天這篇博客,我把 MySQL 里表的約束從頭到尾梳理一遍,全部是面試、開發(fā)高頻考點,配案例、配語法、配易錯點,看完直接能用在項目里。
一、什么是表約束?為什么要用?
數(shù)據(jù)類型只能做最基礎的限制,但業(yè)務里要求更嚴格:比如郵箱不能重復、姓名不能為空、學號必須唯一、成績不能為負……
約束 = 給字段加 “規(guī)則”,從業(yè)務層面保證數(shù)據(jù)合法、正確、不混亂。
MySQL 常用約束一共 8 個:NULL / NOT NULL、DEFAULT、COMMENT、ZEROFILL、PRIMARY KEY、AUTO_INCREMENT、UNIQUE KEY、FOREIGN KEY。
二、空屬性:NULL / NOT NULL
作用
控制字段是否允許為空。
NULL:允許為空(默認)NOT NULL:不允許為空
關鍵點
- 空值無法參與運算:
1 + NULL = NULL - 實際開發(fā)盡量用
NOT NULL,數(shù)據(jù)更可靠
示例
CREATE TABLE myclass(
class_name VARCHAR(20) NOT NULL,
class_room VARCHAR(10) NOT NULL
);
插入時缺了 class_room 直接報錯:
ERROR 1364 : Field 'class_room' doesn't have a default value
三、默認值:DEFAULT
作用
插入數(shù)據(jù)時不指定該字段,自動使用預設值。
示例
CREATE TABLE tt10 (
name VARCHAR(20) NOT NULL,
age TINYINT UNSIGNED DEFAULT 0,
sex CHAR(2) DEFAULT '男'
);
只插 name,age=0、sex = 男 自動填充:
INSERT INTO tt10(name) VALUES('zhangsan');
四、列描述:COMMENT
作用
給字段加注釋說明,方便團隊維護。
示例
CREATE TABLE tt12 (
name VARCHAR(20) NOT NULL COMMENT '姓名',
age TINYINT UNSIGNED DEFAULT 0 COMMENT '年齡'
);
查看注釋
SHOW CREATE TABLE tt12\G
五、零填充:ZEROFILL
作用
數(shù)字不足指定位數(shù)時,前面補 0,只影響顯示,不影響存儲。
示例
ALTER TABLE tt3 CHANGE a a INT(5) UNSIGNED ZEROFILL;
插入 1 → 顯示 00001,實際存儲還是 1。
六、主鍵:PRIMARY KEY
作用
唯一標識一行數(shù)據(jù),約束最強:
- 不能重復
- 不能為空
- 一張表最多一個主鍵
示例
CREATE TABLE tt13 (
id INT UNSIGNED PRIMARY KEY COMMENT '學號',
name VARCHAR(20) NOT NULL
);
復合主鍵
多個字段一起做主鍵,組合唯一:
CREATE TABLE tt14(
id INT UNSIGNED,
course CHAR(10),
PRIMARY KEY(id, course)
);
追加 / 刪除主鍵
ALTER TABLE 表 ADD PRIMARY KEY(字段); ALTER TABLE 表 DROP PRIMARY KEY;
七、自增長:AUTO_INCREMENT
作用
字段不賦值時自動 + 1,通常配合主鍵使用。
特點
- 必須是索引列
- 必須是整數(shù)
- 一張表最多一個自增
示例
CREATE TABLE tt21(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(10) NOT NULL DEFAULT ''
);
獲取剛插入的自增 ID
SELECT LAST_INSERT_ID();
八、唯一鍵:UNIQUE KEY
作用
保證字段業(yè)務不重復,但允許為 NULL。
主鍵 vs 唯一鍵
- 主鍵:不能為空,一張表一個
- 唯一鍵:可以為空,一張表多個
示例
CREATE TABLE student (
id CHAR(10) UNIQUE COMMENT '學號',
name VARCHAR(10)
);
九、外鍵:FOREIGN KEY
作用
約束表與表之間的關系,保證數(shù)據(jù)邏輯一致。
規(guī)則:
- 從表外鍵的值 必須在主表主鍵里存在
- 或為 NULL
示例
先建主表(班級):
CREATE TABLE myclass (
id INT PRIMARY KEY,
name VARCHAR(30) NOT NULL
);
再建從表(學生):
CREATE TABLE stu (
id INT PRIMARY KEY,
name VARCHAR(30) NOT NULL,
class_id INT,
FOREIGN KEY (class_id) REFERENCES myclass(id)
);
插入不存在的班級 ID 直接報錯,保證數(shù)據(jù)不亂。
十、綜合實戰(zhàn):商城三表設計(高頻面試題)
商品表、客戶表、訂單表,一次寫完主外鍵 + 所有約束:
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 '單價(分)',
category VARCHAR(12) COMMENT '類別',
provider VARCHAR(64) NOT NULL COMMENT '供應商'
);
-- 客戶表
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)
);
十一、高頻考點速記(面試必背)
NOT NULL不能為空,DEFAULT提供默認值COMMENT是注釋,ZEROFILL只補 0 不改變存儲- 主鍵唯一且非空,一張表一個
- 自增長必須是整數(shù)、索引列
- 唯一鍵允許 NULL,可建多個
- 外鍵保證表關系合法,主表必須有主鍵 / 唯一鍵
十二、MySQL 約束|表結構修改|數(shù)據(jù)修改 終極對比表
(一眼不混,直接背)
| 分類 | 作用 | 關鍵字 / 語句 | 示例 |
|---|---|---|---|
| 1. 字段約束(建表用) | 給字段定規(guī)則(不能為空、唯一、默認值等) | 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. 修改表結構(ALTER) | 改表:加字段、刪字段、改約束、加主鍵 | ALTER TABLE 表ADD(添加)DROP(刪除)MODIFY(改類型 / 約束)CHANGE(改名 + 改類型) | ALTER TABLE t ADD PRIMARY KEY(id);ALTER TABLE t MODIFY name NOT NULL; |
| 3. 修改表中數(shù)據(jù) | 改表里的內容:增 / 刪 / 改記錄 | INSERT(插入)UPDATE(修改)DELETE(刪除) | INSERT INTO t VALUES (1,' 張三 ');UPDATE t SET name=' 李四 ' WHERE id=1;DELETE FROM t WHERE id=1; |
最核心記憶口訣(背會永不混)
- 約束:管字段規(guī)則(NOT NULL / PRIMARY KEY 等)
- ALTER:管表結構(加字段、改約束、加主鍵)
- INSERT / UPDATE / DELETE:管表里的數(shù)據(jù)
十三、結束語
MySQL 約束看似多,其實邏輯非常統(tǒng)一:都是為了管住數(shù)據(jù),不讓臟數(shù)據(jù)進庫。開發(fā)時先想清楚字段規(guī)則,再建表,后面少填無數(shù)坑。
以上就是一文系統(tǒng)梳理MySQL數(shù)據(jù)庫中表的約束的詳細內容,更多關于MySQL表約束的資料請關注腳本之家其它相關文章!
相關文章
Django創(chuàng)建項目+連通mysql的操作方法
這篇文章主要介紹了Django創(chuàng)建項目+連通mysql的操作方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
MySQL數(shù)據(jù)庫定時備份的實現(xiàn)方法
這篇文章主要介紹了MySQL數(shù)據(jù)庫的定時備份的相關知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-04-04

