千家信息网

MySQL——约束(constraint)详细解释

发表于:2025-11-11 作者:千家信息网编辑
千家信息网最后更新 2025年11月11日,约束是什么用来干嘛?约束实际上就是表中数据的限制条件作用:表在设计的时候加入约束的目的就是为了保证表中的记录完整和有效比如一些字段的唯一性,将一些字段约束成外键约束种类:非空约束(not null)唯
千家信息网最后更新 2025年11月11日MySQL——约束(constraint)详细解释
  1. 约束是什么用来干嘛?
    约束实际上就是表中数据的限制条件
    作用:表在设计的时候加入约束的目的就是为了保证表中的记录完整和有效
    比如一些字段的唯一性,将一些字段约束成外键

  2. 约束种类:
    非空约束(not null)
    唯一性约束(unique)
    主键约束(primary key) PK
    外键约束(foreign key) FK
    检查约束(目前MySQL不支持、Oracle支持)

A、非空约束
用not null约束的字段不能为null值,必须给定具体的数据
创建表,给字段添加非空约束(创建用户表,用户名不能为空)

create table blog (
id int(12) not null;
)
insert插入数据时如果插入id为null直接报错

B、唯一性约束
unique约束的字段,具有唯一性,不可重复,但可以为null
创建表,保证邮箱地址唯一(列级约束)
create table blog (
id int(12) not null UNIQUE;
)
表级约束
create table blog (
id int(12) not null;
UNIQUE(id);
)
如果插入相同 id 会报错
使用表级约束,给多个字段联合约束
联合约束,表示两个或以上的字段同时与另一条记录相等,则报错
create table blog (
id int(12) not null;
name varchar(20) not null;
unique(id,name);
)
如果与联合字段都相同,则报错
表级约束可以给约束起名字(方便以后通过这个名字来删除这个约束)
create table blog (
id int(12) not null;
name varchar(20) not null;
CONSTRAINT t_id_name unique(id,name);
)
constraint是约束关键字,t_user_email_unique自己取的名字

C、主键约束(primary key)PK
表设计时一定要有主键
主键约束
主键字段
主键值
表中的某个字段添加主键约束后,该字段为主键字段,主键字段中出现的每一个数据都称为主键值
主键约束与"not null unique"区别:给某个字段添加主键约束之后,该字段不能重复也不能为空,效果和"not null unique"约束相同,但是本质不同。
主键约束除了可以做到"not null unique"之外,还会默认添加"索引--index"
一张表应该有主键字段,如果没有,表示该表无效
主键值:是当前行数据的唯一标识、是当前行数据的身份
即使表中两行记录相关数据相同,但由于主键值不同,所以也认为是两行不同的记录
按主键约束的字段数量分类:无论是单一主键还是复合主键,一张表主键约束只能有一个(约束只能有一个,但可以作用到好几个字段)
单一主键:给一个字段添加主键约束
复合主键:给多个字段联合添加一个主键约束(只能用表级定义)
1)单一主键(列级定义)
mysql> create table t_user(
-> id int(10) primary key,
-> name varchar(30)
-> );
Query OK, 0 rows affected (0.07 sec)
2)单一主键(表级定义)
mysql> create table t_user(
-> id int(10),
-> name varchar(30) not null,
-> constraint t_user_id_pk primary key(id)
-> );
Query OK, 0 rows affected (0.01 sec)
3)复合主键(表级定义)
mysql> create table t_user(
-> id int(10),
-> name varchar(30) not null,
-> email varchar(128) unique,
-> primary key(id,name)
-> );
Query OK, 0 rows affected (0.05 sec)

在MySQL数据库提供了一个自增的数字,专门用来自动生成主键值,主键值不用用户维护,自动生成,自增数从1开始,以1递增(auto_increment)
mysql> create table t_user(
-> id int(10) primary key auto_increment,
-> name varchar(30) not null
-> );
Query OK, 0 rows affected (0.03 sec)
插入两行记录,id主键值会自动增加
mysql> insert into t_user(name) values('jay');
Query OK, 1 row affected (0.04 sec)

mysql> insert into t_user(name) values('man');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_user;
+----+------+
| id | name |
+----+------+
| 1 | jay |
| 2 | man |
+----+------+
2 rows in set (0.00 sec)

D、外键约束(foreign key)FK
只能是表级定义
foreign key(classno) references t_class(cno)
外键约束主要用来维护两个表之间数据的一致性
外键约束
外键字段
外键值

外键约束、外键字段、外键值之间的关系:某个字段添加外键约束之后,该字段称为外键字段,外键字段中每个数据都是外键值

按外键约束的字段数量分类:a、单一外键:给一个字段添加外键约束
b、复合外键:给多个字段联合添加一个外键约束

一张表可以有多个外键字段(与主键不同)

栗子:存储学生班级 信k 息
mysql> drop table if exists t_student;
mysql> drop table if exists t_class;

mysql> create table t_class(
-> cno int(10) primary key,
-> cname varchar(128) not null unique
-> );

mysql> create table t_student(
-> sno int(10) primary key auto_increment,
-> sname varchar(30) not null,
-> classno int(3),
-> foreign key(classno) references t_class(cno)
-> );

mysql> insert into t_class(cno,cname) values(100,'aaaaaaxxxxxx');
mysql> insert into t_class(cno,cname) values(200,'oooooopppppp');
mysql> insert into t_student(sname,classno) values('jack',100);
mysql> insert into t_student(sname,classno) values('lucy',100);
mysql> insert into t_student(sname,classno) values('king',200);
班级表t_class:
mysql> select from t_class;
+-----+--------------+
| cno | cname |
+-----+--------------+
| 100 | aaaaaaxxxxxx |
| 200 | oooooopppppp |
+-----+--------------+
学生表t_student:
mysql> select
from t_student;
+-----+-------+---------+
| sno | sname | classno |
+-----+-------+---------+
| 1 | jack | 100 |
| 2 | lucy | 100 |
| 3 | king | 200 |
+-----+-------+---------+
上表中找出每个学生的班级名称:
mysql> select s.,c. from t_student s join t_class c on s.classno=c.cno;
+-----+-------+---------+-----+--------------+
| sno | sname | classno | cno | cname |
+-----+-------+---------+-----+--------------+
| 1 | jack | 100 | 100 | aaaaaaxxxxxx |
| 2 | lucy | 100 | 100 | aaaaaaxxxxxx |
| 3 | king | 200 | 200 | oooooopppppp |
+-----+-------+---------+-----+--------------+
这就是数据实体的一对多关系模型:在多的那一方加外键来约束

字段 数据 联合 不同 相同 唯一性 多个 学生 就是 班级 用户 两个 之间 作用 名字 数量 自动生成 保证 分类 支持 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 江门迁入户口提示服务器异常 学习护苗网络安全心得注意事项 KV数据库嵌入式 网安网络安全检查都应该检查什么 车体ecu软件开发 软件开发机械工程师是干什么的 全球网络安全官 幼儿园网络安全工作简报 软件开发领域状态分析 安永 网络安全分析大赛 网络安全宣传舞蹈快板 网络安全法第二十七条提到 服务器开通远程桌面安全吗 战地一首页一进去就服务器中断 o reilly图数据库 计算机网络技术找工作难吗 dpb 网络安全 绩效考核软件开发功能需求 软件开发培训班价格 中山网络安全平台 网络安全规范要求网口封闭 徐汇区第三方软件开发代理商 网络技术赚外快 网络安全技术维护简报 解释数据库冷备份和热备份 阴阳师一号玩家服务器是什么 广州市毛毛球网络技术有限公司 王牌战争在哪里可以创建服务器 关于网络安全法错误的有 光遇OPPO服务器
0