MySQL表的约束

ops/2024/9/23 5:16:09/

文章目录

    • 0. 前言
    • 1. 空属性
    • 2. 默认值
    • 3. comment
    • 4. zerofill
    • 5. 主键
    • 6. 自增长
    • 7. 唯一键
    • 8. 外键

0. 前言

表的约束是保证插入的数据都是符合预期的,本质上通过技术手段,倒闭着使用者插入正确的数据。

反过来站在mysql的视角,凡是插入的数据,都是符合数据约束的。

最终目标就是保证数据的完整性和可预期性。

为什么数据库需要对数据进行约束?

数据库是维护用户数据的最后一道防线。

用户从远端输入数据,通过网络传到服务器,服务器对数据做一系列处理,最后插入到数据库

1. 空属性

在语言当中null ,都是表示0,而在数据库当中null表示没有, 表示有,只不过是空串

  • null:默认的,可以为空

  • not null:不为空

    null可以理解为可选可不选,不选就空着;

    not null表示为必选,不能空着

mysql">mysql> create table if not exists myclass (-> class_name varchar(20) not null,-> class_room varchar(20) not null,-> other varchar(20) -> );

image-20240423145207460

当属性设置为not null之后,插入数据的时候,不能为空

image-20240423145856425

2. 默认值

如果某个数据经常出现,可以在一开始就指定好,用户指定就使用用户输入,没指定就采用默认的,这就是默认值

mysql">mysql> create table if not exists t1(-> name varchar(20) not null,-> age tinyint unsigned default 18,-> gender char(1) default '男'-> );

image-20240424113519046

插入数据:

mysql">mysql> insert into t1 (name, age, gender) values ('小李', '20', '女');
mysql> insert into t1 (name, age, gender) values ('小王', '21', '男');
mysql> insert into t1 (name) values ('小默');

image-20240424113734199

defaultnot null

mysql">mysql> create table t2(-> name varchar(20) not null,-> age tinyint default 18,-> gender char(1) not null default '男'-> );

image-20240424114025254

mysql">mysql> insert into t2 (name, age, gender) values (null, 20, '男');
mysql> insert into t2 (age, gender) values (20, '男');

image-20240424114211795

第一次插入指定为null,报错显示name不允许为null

第二次不插入name,报错显示没有默认值。

所以当没有指定一列要插入,使用的是default;如果建表的时候,该对应列没有设置default值,则无法直接插入

not nulldefault不冲突,是互相补充的:

  • 当用户想插入时,not null进行约束
  • 当用户忽略这一列时,采用默认值(设置了默认值)
    如果没有设置,则报错

在建表时如果没有指定默认值,mysql会作出优化,自动添加默认值为null

mysql">mysql> create table t3(-> name varchar(20),-> age tinyint-> );

image-20240424115447000

一般情况下,not nulldefault不会同时设置,因为default本身有默认值,不会为空

3. comment

comment是对列进行描述说明的,没有实际含义,可以理解为注释

mysql">mysql> create table if not exists t4(-> name varchar(20) not null comment '用户名',-> age tinyint unsigned default 18 comment '年龄, 默认18岁',-> gender char(1) default '男' comment '性别, 默认男'-> );
mysql> show create table t4 \G

image-20240424120113660

通过desc看不出描述信息:

mysql">mysql> desc t4;

image-20240424120313292

4. zerofill

zerofill是关于显示方面的约束,在需要标准显示的场景使用

mysql">create table if not exists t5 ( a int unsigned not null, b int unsigned not null );

image-20240425111157072

建立表的时候并没有指定int后面括号的值,show create table t5 \G查看:

image-20240425111400543

mysql会默认带上int(10),给b增添zerofill约束:

mysql">mysql> alter table t5 modify b int unsigned zerofill not null;

image-20240425111740989

插入数据发现b自动添加了很多0,这就是zerofill的作用,如果宽度小于设置的宽度,会自动填充0

这个宽度就是int(width),括号里面的值;

zerofill虽然会填充0,但这只是显示的结果,最后在mysql中存储的还是22

image-20240425111827369

为什么int unsigned默认是10

mysql">mysql> alter table t5 modify a int not null;
mysql> alter table t5 modify b int unsigned not null;

image-20240425114348851

这里发现有符号默认11,无符号默认10,这是因为int占四个字节,有符号的范围是-231 ~ 231-1,无符号的范围是0 ~ 232-1

也就是21亿多和42亿多,最后表示出来也就是10位,int有符号需要一位来表示符号,所以为11

5. 主键

主键用来约束这个字段里面的数据不能重复,不能为空

就相当于我们注册账号,必须要有用户名,且不能重复

mysql">mysql> create table if not exists t8(-> id int unsigned primary key,-> password varchar(20) default '123'-> );

image-20240425122707143

有主健约束的字段,不能重复

如果要去掉主键,直接drop即可,因为一张表里面,只有一个主键

mysql">mysql> alter table t8 drop primary key;

image-20240425123246657

如果在创建表之后,想要添加主键约束,要保证该列数据没有冲突,否则无法添加主键约束

mysql">alter table table_name add primary key(column_name);	#添加主键约束

复合主键:

一个表只能有一个主键,不意味着只能添加给一列,可以添加到多列,这叫复合主键

mysql">mysql> create table student_scores (-> stu_id int unsigned,-> exam_id int unsigned,-> score int unsigned,-> primary key(stu_id, exam_id)-> );

image-20240425124158906

这里两个pri合起来才是一个主键,它们两个同时一样时,才触发主键约束

image-20240425124540128

6. 自增长

auto_increment对应的字段,如果不给值,会自动触发,系统从当前字段中已有的最大值+1

通常搭配主键使用。

  • 任何一个字段要做自增长,前提是本身必须是一个索引值

  • 自增长的字段必须是整数

  • 一张表最大一个自增字段

mysql">mysql> create table if not exists t9 (-> id int unsigned primary key auto_increment,-> name varchar(20) not null default ''-> );

image-20240425160411198

mysql">mysql> insert into t9 (name) values ('张三');
mysql> insert into t9 (name) values ('李四');

image-20240425160543427

指定显示插入:

image-20240425160857023

索引:

可暂时简单理解为书本多花几页纸来打印目录,为了读者更快定向找到书中的内容

7. 唯一键

一张表可能会有多个字段需要唯一性,但是一张表只能有一个主键;唯一键就可以解决一张表中多个字段需要唯一性约束的问题

mysql">mysql> create table t10 (-> id char(20) primary key,-> tel char(32) unique, -> name varchar(20) );

image-20240425174041486

插入数据:

image-20240425174358443

主键与唯一键的区别:

唯一键允许为空,空字段不做唯一性比较。

唯一键与主键并不冲突,主键保证记录的唯一性,唯一键保证指定的信息在表中不出现重复,一般建议将主键设置为与当前业务无关的字段。

8. 外键

mysql是关系型数据库,表和表之间可能是会有关联的,外键就用于定义表和表之间的关系。

当定义外键后,要求外键列数据必须在主表的主键列存在或为null。

mysql">mysql> create table if not exists class (-> id int unsigned primary key,-> name varchar(20) not null-> );mysql> create table if not exists student (-> id int unsigned primary key,-> name varchar(20) not null,-> telphone varchar(32) unique key,-> class_id int,-> foreign key(class_id) references class(id)	#外键约束-> );

image-20240425230825008

mysql">mysql> insert into class values (23402101, 'BD1');
mysql> insert into class values (23402102, 'BD2');

image-20240425231033444

当有外键约束的时候,要插入不存在的班级编号是不允许插入的,当要删除这个主表还被其他从表关联的时候,是不允许删除的

image-20240425231605742

外键的条件:

  • 主表和从表产生关联关系
  • 产生外键约束

http://www.ppmy.cn/ops/35913.html

相关文章

基于 Ubuntu22.04 安装 SSH 服务

文章目录 一、Ubuntu22.04 安装 SSH 服务二、配置 OpenSSH(安全性)1. 更改 OpenSSH 端口2. 限制使用 SSH 登录尝试次数3. 禁止 SSH 以 root 身份连接 三、设置防火墙(UFW)锁定 SSH四、远程终端软件通过 SSH 连接 Ubuntu22.041. 远…

java: 通过证书访问etcd

一、首先,要使用cfssl生成etcd证书相关的文件(ca.pem server.pem server-key.pem ),然后把server-key.pem进行转换: openssl pkcs8 -topk8 -nocrypt -in server-key.pem -out server.key二、带证书启动etcd ./etcd --name infra0 --cert-file/root/s…

西奥机电CHT-01软胶囊弹性硬度测试仪:守护药品运输安全,检测弹性确保不易变形

西奥机电CHT-01软胶囊弹性硬度测试仪:守护药品运输安全,检测弹性确保不易变形 在当今药品行业,药品运输的安全性成为了消费者和生产企业共同关注的焦点。特别是对于软胶囊这类易变形的药品,如何在运输过程中保持其形态完整、药效…

物料厘不清?企业如何做好“物料管理”

物料包括原材料、半成品、成品、辅助用品以及生产过程中必然产生的边角余料、废料等。在制造企业中,各个部门的业务流程几乎都要用到物料: 销售和订单录入部门要通过物料确定客户定制产品的构形; 计划部门要根据物料来计划物料和能力的需求…

紧固件失效的原因及预防方法,收藏——SunTorque智能扭矩系统

智能扭矩系统-智能拧紧系统-扭矩自动控制系统-SunTorque 紧固件的失效,指的是紧固件在使用过程中,由于各种原因导致其性能下降或完全丧失,从而无法继续完成预定的功能。紧固件失效不仅会影响设备的正常运行,还可能引发安全事故&a…

Linux-03

cat 由第一行开始显示文件内容 tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写 nl 显示的时候,顺道输出行号 more 一页一页的显示文件内容 less 与 more 类似,但是比 more 更好的是,他可以往前翻页 (空格翻页 退出q命令) h…

企业微信hook接口协议,ipad协议http,客户群发送任务,获取要发送的客户群列表

客户群发送任务,获取要发送的客户群列表 参数名必选类型说明uuid是String每个实例的唯一标识,根据uuid操作具体企业微信 请求示例 {"uuid": "1688853790533324","id":1101292747044333637, //群发任务id"keyword…

头歌-Java编程基础进阶

第1关 两整数的四则运算 package step1;import java.util.Scanner;public class Arithmetic2Num {public static void main(String[] args) { // ---------------------Begin------------------------Scanner scnew Scanner(System.in);int asc.nextInt();int bsc.nextInt();…