SQL约束

约束

1.概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。

2.目的:保证数据库中数据的正确、有效性和完整性。

3.分类:

约束 描述 关键字
非空约束 限制该字段的数据不能为null NOT NULL
唯一约束 保证该字段的所有数据都是唯一、不重复的 UNIQUE
主键约束 主键是一行数据的唯一标识,要求非空且唯一 PRIMARY KEY
默认约束 保存数据时,如果未指定该字段的值,则采用默认值 DEFAULT
检查约束(8.0.1版本后) 保证字段值满足某一个条件 CHECK
外键约束 用来让两张图的数据之间建立连接,保证数据的一致性和完整性 FOREIGN KEY

注意:约束是作用于表中字段上的,可以再创建表/修改表的时候添加约束。

常用约束

约束条件 关键字
主键 PRIMARY KEY
自动增长 AUTO_INCREMENT
不为空 NOT NULL
唯一 UNIQUE
逻辑条件 CHECK
默认值 DEFAULT

例子:

sql 复制代码
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)
);

外键约束

  • 概念

    外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。

添加外键:

sql 复制代码
CREATE TABLE 表名(
    字段名 字段类型,
    ...
    [CONSTRAINT] [外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名)
);
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名);
-- 例子
alter table emp add constraint fk_emp_dept_id foreign key(dept_id) references dept(id);

删除外键:
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;

删除/更新行为

行为 说明
NO ACTION 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新(与RESTRICT一致)
RESTRICT 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新(与NO ACTION一致)
CASCADE 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则也删除/更新外键在子表中的记录
SET NULL 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(要求该外键允许为null)
SET DEFAULT 父表有变更时,子表将外键设为一个默认值(Innodb不支持)

更改删除/更新行为:
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名(主表字段名) ON UPDATE 行为 ON DELETE 行为;

例子:

sql 复制代码
insert into dept(id, name)
VALUES (1, '科技部'),
       (2, '市场部'),
       (3, '财务部');

alter table score
    add dept_id int;
    
alter table score
    add constraint fk_score_dept_id foreign key (dept_id) references dept (id) on update cascade on delete cascade;
相关推荐
d***93521 小时前
Redis五种用途
数据库·redis·缓存
Armyyyyy丶21 小时前
MySQL系列之数据读取与存储核心机制
数据库·mysql·架构分析
TDengine (老段)21 小时前
TDengine 字符串函数 Replace 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
华仔啊21 小时前
MySql 的 VARCHAR 和 TEXT 怎么选?大厂都在用的文本存储方案
后端·mysql
workflower21 小时前
软件压力测试
数据库·压力测试·需求分析·个人开发·极限编程·结对编程
2501_941111821 天前
使用Scikit-learn进行机器学习模型评估
jvm·数据库·python
爬山算法1 天前
Redis(128)Redis的跳表(Skip List)是如何实现的?
数据库·redis·list
a***13141 天前
保姆级JavaWeb项目创建、部署、连接数据库(tomcat)
数据库·tomcat·firefox
z***75151 天前
PostgreSQL 查看数据库及表中数据占用空间大小
数据库·postgresql·oracle
Wang's Blog1 天前
MySQL: 安装MySQL示例数据库Sakila的完整流程与技术要点
数据库·mysql