基础-约束

一、MySQL基础

在数据库的世界里,数据就像一座大厦的基石。如果基石不稳固,整座大厦就会摇摇欲坠。MySQL中的约束机制,正是这座大厦的钢筋骨架,确保数据的准确性、有效性和完整性。正如我们生活中需要交通规则来保证道路安全一样,数据库也需要约束来避免无效、冗余或冲突的数据进入系统。

1. 约束

约束是作用于表中字段上的规则,用于限制存储在表中的数据。它不是数据库的"枷锁",而是"守护者"------它确保数据符合业务逻辑,避免"脏数据"的产生。

"数据类型是约束字段的基础,但仅靠数据类型无法实现全面的约束。"

------《MySQL约束知识体系》

2. 六大约束详解

1. 非空约束 (NOT NULL):"必填项"的守护者

定义:限制字段的值不能为NULL,必须填写具体数据。

sql 复制代码
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,  -- 必填
    email VARCHAR(100) NOT NULL -- 必填
);

小贴士:在业务中,我们常说"必填字段",这正是NOT NULL约束的体现。

2. 唯一约束 (UNIQUE):"独一无二"的保障

定义:确保字段的值在表中唯一(允许NULL,但NULL只允许出现一次)。

sql 复制代码
CREATE TABLE users (
    id INT PRIMARY KEY,
    email VARCHAR(100) UNIQUE,  -- 邮箱必须唯一
    phone VARCHAR(20) UNIQUE   -- 手机号必须唯一
);

与主键区别:主键不能为NULL且一个表只能有一个,唯一约束可多个且允许NULL。

3. 主键约束 (PRIMARY KEY):"身份证"的终极保障

定义:非空+唯一,唯一标识表中每一行,一张表只能有一个主键。

sql 复制代码
CREATE TABLE products (
    product_id INT PRIMARY KEY AUTO_INCREMENT,  -- 自增主键
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10,2)
);

在超市中,每个商品都有唯一的条形码(主键)。即使两个商品名称相同(如"可乐"),它们的条形码也不同。主键就像商品的"身份证",确保每件商品都能被精准识别。

自增特性AUTO_INCREMENT是主键的常见搭档,就像给商品自动分配的唯一编号。

4. 默认约束 (DEFAULT):"智能填充"的贴心助手

定义:保存数据时,如果未指定该字段的值,则采用默认值。

sql 复制代码
CREATE TABLE orders (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT,
    status CHAR(1) DEFAULT 'P',  -- 默认状态为'P'(Pending)
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

当你在电商网站下单时,"订单状态"通常默认为"待处理","创建时间"会自动记录当前时间。默认约束就像店员的贴心服务,无需你手动填写,系统已为你准备就绪。

业务价值:减少用户输入,提高数据录入效率。

5. 检查约束 (CHECK):"逻辑守门员"

定义:保证字段值满足特定条件(MySQL 8.0.16+正式支持)。

sql 复制代码
CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    age INT CHECK (age > 0 AND age <= 120),
    salary DECIMAL(10,2) CHECK (salary > 0)
);

想象一个健身房系统,年龄不能为负数,也不能超过120岁。检查约束就像健身房的"年龄守门员",拒绝任何不符合逻辑的年龄数据。

注意:MySQL 5.7及以下版本不支持CHECK约束,但在8.0+版本中已正式支持。

sql 复制代码
-- -------------- > 约束演示 < -----------------
-- 创建表数据
create table user(
-- 数据名称 数据类型 约束类型 自动增长关键字 添加注释
    id int primary key auto_increment comment '主键',
-- 多个约束类型之间用空格隔开即可
    name varchar(10) not null unique comment '姓名',
    age int check ( age > 0 && age <= 120 ) comment '年龄',
    status char(1) default '1'  comment '状态',
    gender char(1) comment '性别'
) comment '用户表';

-- 插入数据
insert into user(name, age, status, gender)
values ('Tom1',19,'1','男'),
       ('Tom2',25,'0','男');
-- 当我再次插入一条数据,主键自动自增
insert into user(name, age, status, gender)
values ('Tom3',21,'2','男');

-- 插入错误,因为name的约束类型为: 不能为NULL
insert into user( name, age, status, gender)
values (null,19,'4','男');

图形化创建的方式

6. 外键约束 (FOREIGN KEY):"关系的纽带"

定义:建立两张表之间的关联关系,确保从表的字段值必须在主表中存在。

部门栏内的数据是用数字替代的,每一个数字对应另一个表中的数据。这个dept_id我们就称之为外界。让我们两个张表的数据产生了连接,外部的表称之为父表,emp称之为子表。我们有时候也称之为主从表。

我们在删除父表的数据时,它会去判断当前父表的这条数据在子表当中是否存在有关联关系,如果存在则不允许删除,这样就保证了数据的完整性。

前两个行为为默认行为。如何在创建外键的时候来指定它们的删除以及更新的规则(行为)呢

看一下语法,演示

图形化界面操作方法:

"约束的本质是通过技术手段,倒逼程序员插入正确的数据,反之,站在MySQL视角,凡是插进来的数据,都是符合数据约束的。"

------《MySQL表的约束》

相关推荐
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [fs]iomap
linux·笔记·学习
falldeep2 小时前
LeetCode高频SQL50题总结
数据结构·数据库·sql·算法·leetcode·职场和发展
万邦科技Lafite2 小时前
淘宝开放API获取订单信息教程(2025年最新版)
java·开发语言·数据库·人工智能·python·开放api·电商开放平台
CoderCodingNo2 小时前
【GESP】C++五级真题(前缀和思想考点) luogu-P10719 [GESP202406 五级] 黑白格
开发语言·c++·算法
阿珊和她的猫2 小时前
页面停留时长埋点实现技术详解
开发语言·前端·javascript·ecmascript
zore_c2 小时前
【C语言】排序算法——希尔排序以及插入排序 ——详解!!!
c语言·数据结构·c++·笔记·算法·排序算法·推荐算法
喵了几个咪2 小时前
Go单协程事件调度器:游戏后端的无锁有序与响应时间掌控
开发语言·游戏·golang
苦 涩2 小时前
考研408笔记之计算机组成原理(五)——中央处理器
笔记·计算机组成原理·考研408
这我可不懂2 小时前
谈谈mcp协议的实现
开发语言·qt·哈希算法