SQL 约束:数据库里的 “规矩方圆”,专治各种 “瞎填乱改”
在数据库的世界里,要是没有点 “规矩”,数据早就乱成一锅粥了。就像抖音上常说的 “无规矩不成方圆”,SQL 约束就是给数据库字段立下的各种规矩,保证数据既靠谱又整齐。今天咱们就来聊聊这些约束,看看它们是怎么给数据 “上规矩” 的。
约束分类:六大金刚各有神通
数据库里有六大约束,个个都有自己的独门绝技,专治不同的数据问题。
非空约束(NOT NULL):必填项,少了不行
就像你在抖音上发作品必须填标题一样,非空约束就是规定某个字段必须填内容,不能是空值(null)。比如在用户表中,用户名这个字段就不能是空的,总不能让用户没名字吧。
create table user(
name varchar(10) not null, -- 用户名不能为空
age int
);
唯一约束(UNIQUE):独一份,不能重复
这就好比抖音上的用户名,每个人的用户名都是独一无二的,不能有重复。唯一约束就是保证某个字段的所有数据都是唯一的,没有重复值。
create table user(
id int,
name varchar(10) unique -- 用户名不能重复
);
主键约束(PRIMARY KEY):身份标识,非空且唯一
主键就像是每个人的身份证号,是一行数据的唯一标识,而且既不能是空值,也不能重复。有了主键,就能精准地找到某一行数据。
create table user(
id int primary key, -- id作为主键,非空且唯一
name varchar(10)
);
默认约束(DEFAULT):默认值,省心省力
当你没给某个字段赋值时,它就会自动采用默认值,就像抖音里有些设置有默认选项一样。比如设置用户状态的默认值为 “1”(表示正常)。
create table user(
id int,
status char(1) default '1' -- 状态默认值为1
);
检查约束(CHECK)(8.0.1 版本后):条件筛选,不符合不行
检查约束就像一个过滤器,保证字段的值满足某个条件。比如规定用户的年龄必须在 0 到 120 之间,毕竟年龄总不能是负数或者太大的数吧。
create table user(
id int,
age int check(age > 0 and age < 120) -- 年龄必须在0到120之间
);
外键约束(FOREIGN KEY):关联两张表,数据不脱节
外键约束用来让两张表的数据建立连接,保证数据的一致性和完整性。就像抖音上的博主和粉丝,博主的信息和粉丝的关注信息是有关联的。比如员工表和部门表,员工所属的部门编号就要关联到部门表的部门编号。
常用约束:高频出场的 “规矩”
在实际使用中,有些约束出场率特别高,咱们得重点关注。
| 约束条件 | 关键字 |
|---|---|
| 主键 | PRIMARY KEY |
| 自动增长 | AUTO_INCREMENT |
| 不为空 | NOT NULL |
| 唯一 | UNIQUE |
| 逻辑条件 | CHECK |
| 默认值 | DEFAULT |
举个例子,创建一个用户表,包含这些常用约束:
create table user(
id int primary key auto_increment, -- 主键且自动增长
name varchar(10) not null unique, -- 不为空且唯一
age int check(age > 0 and age < 120), -- 年龄符合条件
status char(1) default '1', -- 状态有默认值
gender char(1)
);
这里的AUTO_INCREMENT就像抖音的自动播放功能,主键会自动增长,不用咱们手动输入,特别方便。
外键约束:两张表的 “姻缘线”
外键约束就像给两张表牵了一根线,让它们的数据关联起来。
添加外键
可以在创建表的时候添加外键,也可以在修改表的时候添加。
-- 创建表时添加外键
CREATE TABLE emp(
id int,
dept_id int,
CONSTRAINT fk_emp_dept_id FOREIGN KEY(dept_id) REFERENCES dept(id)
);
-- 修改表时添加外键
ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES dept(id);
删除外键
如果不想让两张表再关联了,就可以删除外键。
ALTER TABLE emp DROP FOREIGN KEY fk_emp_dept_id;
删除 / 更新行为
当主表的数据发生变化时,子表的数据该怎么处理呢?这就有几种不同的行为。
| 行为 | 说明 |
|---|---|
| NO ACTION | 父表删除 / 更新对应记录时,若有对应外键,不允许操作(和 RESTRICT 一样) |
| RESTRICT | 和 NO ACTION 一样,不允许操作 |
| CASCADE | 父表删除 / 更新时,子表对应的外键记录也跟着删除 / 更新,就像 “一荣俱荣,一损俱损” |
| SET NULL | 父表有变动,子表的外键值设为 null(前提是外键允许为 null) |
| SET DEFAULT | 父表变动,子表外键设为默认值(Innodb 不支持) |
比如设置当部门表(主表)的部门编号更新时,员工表(子表)的部门编号也跟着更新,当部门表的部门被删除时,员工表对应的部门编号设为 null:
ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE SET NULL;