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

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中没有的班级值

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

http://www.xdnf.cn/news/2528.html

相关文章:

  • 数据结构*栈
  • 微信小程序连续多个特殊字符自动换行解决方法
  • DSP48E2 的 MAC模式功能仿真
  • C#与SVN的深度集成:实现版本控制自动化管理​
  • 【星海出品】K8S调度器leader
  • 如何验证二叉搜索树(BST):Java实现详解
  • C++ 可调用实体 (详解 一站式)
  • 我的HTTP和HTTPS
  • Mariadb 防火墙服务器和端口:mysql | 3306
  • 如何实现Kafka的Exactly-Once语义?
  • 关于kafka
  • 突破JVM边界:类加载三重门与栈帧的生存法则
  • 如何搭建spark yarn 模式的集群集群。
  • 如何在idea中写spark程序
  • Excel处理控件Aspose.Cells for Go :通过 C++ 实现的设计概念和 API 架构讲解
  • 深入浅出限流算法(三):追求极致精确的滑动日志
  • threejs学习002-场景中添加几何体
  • Kubernetes》》k8s》》explain查 yaml 参数
  • OpenCV 图形API(67)图像与通道拼接函数-----水平拼接(横向连接)两个输入矩阵(GMat 类型)函数concatHor()
  • STM32 HAL库实现USB虚拟串口
  • 蓝桥杯算法实战分享
  • Lua 第13部分 位和字节
  • 《Science》观点解读:AI无法创造真正的智能体(AI Agent)
  • Python中的Walrus运算符分析
  • HikariCP 6.3.0 完整配置与 Keepalive 优化指南
  • 1.1 道路结构特征
  • 【博通芯片方案】调试指令详解版一(无线)
  • Docker容器跑定时任务脚本
  • 分布式一致性算法起源思考与应用
  • 4.2.2 MySQL索引原理以及SQL优化