当前位置: 首页 > news >正文

MySQL 表的约束(二)

文章目录

  • 自增长
  • 唯一键
  • 外键

在这里插入图片描述

自增长

  1. auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键
create table t1(
id int unsigned primary key auto_increment,
name varchar(20) not null
)auto_increment=500;
// 可以手动设置auto_increment的初始值
insert into t1 (name) values('张三');
insert into t1 (name) values('张三');
insert into t1 (name) values('张三');

在这里插入图片描述

2. 自增长,不用管,自己可以解决冲突的问题

在这里插入图片描述

3. 手动插入一个值,从这个值的后面开始自增,如果没有插入值,默认从1开始自增

在这里插入图片描述
为什么会插入我们给的值呢?因为手动修改了auto_increment的值
在这里插入图片描述
4. 查看最后一次自增长插入的值

select last_insert_id();

在这里插入图片描述

5. 自增长的特点:
<> 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
<> 自增长字段必须是整数
<> 一张表最多只能有一个自增长

6. 索引的简单介绍:可以类比于一本书的目录,通过目录可以找到你需要内容的页码,增加了目录也相当于牺牲了空间换取了时间,达到高效查找的目的

唯一键

  1. 唯一键可以为空(NULL),但是主键不能为空(NULL)
create table stu(
id char(10) unique comment '这个是学生的主键',
name varchar(32) not null
);
insert into stu (id,name) values('123','张三');
insert into stu  (id,name) values(NULL,'李四'); 

在这里插入图片描述
2. 主键和唯一键并不冲突,你设置了主键,但是还需要另一个事物保证它也是唯一的

// 可以把电话号码设为唯一键
// qq和电话号码肯定是唯一的
create table student(
id char(20) primary key,
name varchar(32) not null,
telphone varchar(20) unique key,
qq varchar(20) unique key
);

在这里插入图片描述
3. 也可以将唯一键设置为不为空

alter table student modify telphone varchar(20) unique not null;
alter table student modify qq varchar(30) unique not null; 

在这里插入图片描述

4. 一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。
5. 唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
6. 关于唯一键和主键的区别:
我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复
比如你的身份证号要设置为主键,但是每个人的学号也是不同的,也要保持唯一性

外键

  1. 外键:外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
    <> 从表和主表的关联关系
    <> 产生外键约束
// 先建学生表(从表)
create table student(
id int unsigned primary key auto_increment,
name varchar(30) not null,
telphone varchar(20) notnull,
class_id int
);// 再建班级表(主表)
create table class(
id int primary key,
name varchar(30) not null
);// id是自增长的
insert into student (name,telphone,class_id) values('张三','12345678910',1);
insert into student (name,telphone,class_id) values('李四','123456789',1);insert into class values(1,'通信101');
insert into class values(2,'通信102');

2. 虽然这个田七插入到了3号班级,但是不存在3号班级,这在逻辑上是不对的,又比如把一个班级删除,但是这个班级下还有学生,这也是不对的

在这里插入图片描述

3. 如何解决上述问题呢?
关联两张表需要关联关系和约束关系

在这里插入图片描述

create table if not exists student(
id int unsigned primary key ,
name varchar(30) not null,
telphone varchar(20) unique key,
class_id int,
foreign key(class_id) references class(id)
// 从表中的class_id和主表的id建立联系
);

在这里插入图片描述
4. class_id和id建立了约束,不能插入id中没有的班级值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

  • vs2022解决 此项目需要MFC库。从visual studio安装程序(单个组件选项卡)为正在使用的任何工具和体系结构安装他们问题
  • 【AI生产力工具】Windsurf,一款AI编程工具
  • 目标检测YOLO实战应用案例100讲- 无人机平台下露天目标检测与计数
  • 新能源汽车声纹监测技术的发展趋势是什么?
  • [Linux运维] [Ubuntu/Debian]在Lightsail Ubuntu服务器上安装Python环境的完整指南
  • ETL架构、数据建模及性能优化实践
  • 开源模型应用落地-全能音频新纪元-Kimi-Audio-7B-Instruct-重塑多模态交互边界
  • 网络原理 - 10(HTTP/HTTPS - 1)
  • LBS服务(基于位置的服务)与LLM(大型语言模型)交互功能分析
  • 为什么PPT中的视频无法播放?
  • 【Robocorp实战指南】Python驱动的开源RPA框架
  • 分析整体文档集合质量:来源多样性、内容新鲜度、信息密度、内容具体性
  • JVM——引入
  • 了解Android studio 初学者零基础推荐(1)
  • 组装 (DIY) 一台显示器 (4K 屏支持 4 画面分屏 PBP 1080p x4)
  • 【保姆级教程-Centos7环境下部署mongodb并设置开机自启】
  • node.js puppeteer 实践
  • 利用Python生成Xilinx FPGA ROM IP核 .coe初始化文件
  • Vue 3 vuedraggable 例子
  • 5000元可以运行32B大模型的笔记本
  • 大理杨徐邱再审上诉案宣判:驳回上诉,维持再审一审判决
  • 秦洪看盘|浮现新预期,存量资金积极调仓
  • 吕国范任河南省人民政府副省长
  • 美军空袭也门拘留中心,已致68人死亡
  • 特朗普将举行集会庆祝重返白宫执政百日,被指时机不当
  • 伤者升至80人,伊朗港口爆炸源头或为“危险品和化学品仓库”