一、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表的约束》