字段的约束条件
创建表:
create table t19(id int,name varchar(32));
往表中添加数据:
insert into t19(name,id) values('tom',1); # 可以自定义字段顺序
insert into t19 values(2,'ami');
查看表数据:
select * from t19;
# 1.无负号unsigned
create table t20(id int unsigned,name varchar(32));
# 2.零填充zerofill
create table t20(id int zerofill,name varchar(32));
# 3.非空not null
create table t20(id int,name varchar(32) not null);
# 所有字段类型不加约束条件的情况下默认都可以为空
# 4.默认值default
create table t20(id int,name varchar(32) default 'jason');
# 5.唯一值unique
# 单列唯一 : 使用后所在的字段名数据不能重复
create table t20(id int unique,name varchar(32));
# 联合唯一 使用后组合后的数据不能重复
create table t20(id int,name varchar(32) default 'jason');
主键
# 1.主键设置 primary key
create table t1(id int primary key,name varchar(32));
# -1. 单从约束层面上而言主键相当于not null + unique(非空且唯一)
# -2. InnoDB引擎规定一张表只能有一个主键
- 1.如果创建的表没有设置主键,非空且唯一的字段会被默认设为主键,
非空且唯一的的字段也没有,InnoDB会将隐藏的字段作为主键
id int not null unique
- 2.主键可以加快数据查询
- 3.创建表的时候都需要有id字段,并且id字段应设为主键
- 4.单列主键 id int primary key
- 5.联合主键 id1 int,id2 int,primary key(id1,id2)
# 2.主键自增 auto_increment
# -1.主键的自增作为约束条件要跟在键的后面,无法单独使用
create table t(id int primary key auto_increment,name varchar(32));
# -2.特点:在删除数据时,自增操作不会回退与重置,要想重置主键,需要对表格式化
truncate 表名; # # 删除表数据并重置主键值
外键
# 1.外键用于记录表与表之间的数据关系
数据的关系有四种:
1. 一对一的关系
2. 一对多的关系
3. 多对多的关系
4. 没有关系
"""对于表关系如何判定呢: 换位思考他们的关系几对几"""
# 2.外键的创建位置
1. 针对'一对多'的关系,外键字段建在多的一方
2. 针对'多对多'的关系,外键需要开设第三张关系表存储数据关系
3. 针对'一对一'的关系,外键可以建在任何一方,但是一般选择建在查询频率较高的表
# 3.外键设置的关键字: foreign key
- 必须基于多张表关系才可以设置表关系
create table t4(
id int primary key auto_increment,
name varchar(32),
t5_id int,
foreign key(t5_id) references t5(id)); create table t5(
id int primary key auto_increment,
t5_name varchar(32),
t5_desc varchar(64));
表关系创建
# 1.一对多
- 创建一对多的表关系数据
1.先写普通字段
2.然后再写外键字段
create table dep(
id int primary key auto_increment,
dep_name varchar(32),
dep_desc varchar(32)
);
create table emp(
id int primary key auto_increment,
name varchar(32),
gender enum('male','female','others') default 'male',
dep_id int,
foreign key(dep_id) references dep(id)
);
操作可能出现的问题:
1.创建表的时候需要先创建没有外键的表,然后是有外键的表
2.插入表数据的时候,外键字段只能写关联表字段里的数据值
3.被关联字段的操作限制性太强,无法进行修改与删除
如何解决: 使用级联更新,级联删除
on update cascade # 级联更新
on delete cascade # 级联删除
"""被关联数据一旦变动,关联的数据同步变动"""
create table emp1(
id int primary key auto_increment,
name varchar(32),
gender enum('male','female','others') default 'male',
dep_id int,
foreign key(dep_id) references dep1(id)
on update cascade
on delete cascade
);
create table dep1(
id int primary key auto_increment,
dep_name varchar(32),
dep_desc varchar(32)
);
"""
- 在实际工作中,很多时候可能并不会使用外键
因为外键增加了表之间的耦合度 不便于单独操作 资源消耗增加
- 我们为了能够描述出表数据的关系,又不想使用外键
自己通过写SQL,建立代码层面的关系
"""
# 2.多对多
- 创建多对多的表关系数据
* 不能直接创建,需要单独开设第三张关系表。存储数据关系
create table book(
id int primary key auto_increment,
title varchar(32)
);
create table author(
id int primary key auto_increment,
name varchar(32)
);
create table bookauthor(
id int primary key auto_increment,
book_id int,
foreign key(book_id) references book(id)
on update cascade # 级联更新
on delete cascade, # 级联删除
author_id int,
foreign key(author_id) references author(id)
on update cascade # 级联更新
on delete cascade # 级联删除
);
# 3.一对一
- 创建一对一的表关系数据
create table userDetail(
id int primary key auto_increment,
phone bigint
);
create table user(
id int primary key auto_increment,
name varchar(32),
detail_id int unique,
foreign key(detail_id) references userDetail(id)
on update cascade
on delete cascade
);
# 4.没有关系