MySQL表的约束

约束

表的约束:表一定要有各种约束,通过约束,让我们未来插入数据库表中的数据是符合预期的。

约束本质是通过技术手段,倒逼程序员插入正确的数据,凡是插入进来的数据都是符合数据约束的!

约束的最终目标:保证数据的完整性和可预期性

所以我们需要很多的约束条件

空属性

NULL,表示什么都没有,与' '不同,' '表示是空的,NULL表示什么都没有

两个值:null(默认的) 和 not null(不为空)

数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空无法参与运算

设置为not null 不能插入null或不插入

默认值

用一种数据会经常性的出现的某个具体的值,可以一开始就指定好,用户可以选择性的使用默契值

尝试插入,一个设置名字,年龄,性别一个只设置名字

not null 与default一起使用呢??

他们两个并不冲突互相补充

not null:约束 当用户插入的时候

default:约束 当用户忽略这一列的时候,使用默认值(如果设置了),没设置,直接报错。

如果建表时没有设定default值

可以看到 mysql 默认设置了 DEFAULT NULL

如果设置了 not null 就不会默认设置 default null

列描述

列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。

zerofill

设置了zerofill 如果设置数值的位数不够那就往前补0

查找依然能找到

更改补0的位数 int(x)-->补x位(浮点数也可以设置)

位数够了就不补0了

主键

主键 primary key:用来唯一的约束该字段里面的数据,不能重复不能为空,一张表中最多有一个主键。但是并不代表一个表中的主键只能添加给一列!一个主键可以被添加到一列或者多列上(复合主键)。

主键所在的列通常是整数类型。

主键自动设置为不允许为空

主键不允许重复、冲突

方便通过查找主键精准查找

删除主键操作

alter table 表名 drop primary key

添加主键操作

alter table 表明 add primary key(列名)

但是添加为主键的那一列不能有重复

删除重复的列后即可添加成功

复合主键 -->多个字段作为主键

id 与 course_id 合起来算一个主键

这两个数据都不一样

这两个数据有一个和历史数据不一样

不可以两个数据都一样

自增长

auto_increment:当对应的字段不给值,会自动的被系统触发系统会从当前字段中已经有的最大值 +1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。

自增长的特点:

  1. 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)

  2. 自增长字段必须是整数

  3. 一张表最多只能有一个自增长

插入时可以不用主动插入自增长

我们发现主键根据上一个插入的主键进行了自增长

因为auto_inrement在表内建立了约束在表外也是可以设置的

如下所示

可以选择之前没使用过的值,但是自增从最大的开始自增

list_insert_id 获取上次插入后的auto_increment 的值

唯一键

一张表中往往很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。

唯一键的本质和主键差不多,唯一键允许为null ,而且可以多个为null,null字段不做唯一性比较。

可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息 出现重复 例如身份证号和员工号,身份证设置为主键,但是员工号也不能重复,就需要一个约束,此时就可以将员工号设置为唯一键。

sql 复制代码
unique key

unique
都可设置

使用实例

sql 复制代码
在定义列时直接指定
CREATE TABLE users (
    id INT PRIMARY KEY,
    email VARCHAR(100) UNIQUE,           -- 使用 UNIQUE
    phone VARCHAR(20) UNIQUE KEY,        -- 使用 UNIQUE KEY
    username VARCHAR(50)
);

在所有列定义后指定
CREATE TABLE users (
    id INT PRIMARY KEY,
    email VARCHAR(100),
    phone VARCHAR(20),
    username VARCHAR(50),
    UNIQUE (email),                     
    UNIQUE KEY (phone),                  
);

唯一键有了就不能重复插入

可以插入null值(主键不能为null)

外键

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束

创建两张表

插入数据后分别为

此时就有问题

  1. 没有三班这个班级

  2. 如果把班级表1班删除了,其实也是不合理的,还有一般的学生

我们上面的 学生表的 class_id班级id 与 教室表的 id班级id是有关联的但是没有约束

所以我们要创建外键约束

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束 。当定义外键后,要求外键列数据必须在主表的主键列存在或为null

sql 复制代码
foreign key (字段名) references 主表(列)

删除上面学生表重新创建一个

插入数据实验

发现不能插入不存在的班级,也不能插入重复的学生id


这篇就到这里啦(づ ̄3 ̄)づ╭❤~

相关推荐
未来龙皇小蓝2 分钟前
【MySQL-索引调优】10:常见的分页优化处理
数据库·mysql·性能优化
God__is__a__girl7 分钟前
Oracle驱动版本引发ORA-01461批量插入异常排查与解决
数据库·oracle
少年攻城狮18 分钟前
Oracle系列---【两个环境,表结构一致,数据量一致,索引也一致,为什么同样的sql执行时间却不一致?】
数据库·sql·oracle
l1t18 分钟前
解决用docker安装umbra数据库遇到的FATAL:Operation not permitted错误
数据库·docker·容器
2401_8942419226 分钟前
机器学习与人工智能
jvm·数据库·python
GentleDevin41 分钟前
Redis服务常用命令
数据库·oracle
難釋懷1 小时前
Redis分片集群手动故障转移
数据库·redis·缓存
无名-CODING1 小时前
从零开始!Vue3+SpringBoot前后端分离项目Docker部署实战(上):环境搭建与数据库容器化
数据库·spring boot·docker
Bdygsl1 小时前
MySQL(2)—— CRUD
数据库·mysql
chushiyunen1 小时前
python edge-tts实现tts文本转语音、音频
数据库·python·音视频