MySQL 表的约束(二)
文章目录
- 自增长
- 唯一键
- 外键

自增长
- 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. 索引的简单介绍:可以类比于一本书的目录,通过目录可以找到你需要内容的页码,增加了目录也相当于牺牲了空间换取了时间,达到高效查找的目的
唯一键
- 唯一键可以为空(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. 关于唯一键和主键的区别:
我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。
比如你的身份证号要设置为主键,但是每个人的学号也是不同的,也要保持唯一性
外键
- 外键:外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或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中没有的班级值