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

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

评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值