约束条件
1.default默认值
插入的时候如果没有输入值则会自动填充默认的值
# 插入值的时候可以指定插入的字段
create table t1(
id int,
name char(4),
age char(6)
);
insert into table(name,age,id) values('json','18',1);
# default默认值
create table t2(
id int,
name char(24),
sex enum('female','male','others') default 'female'
);
insert into t2(id,name) values(1,'json');
insert into t2 values(1,'lemo','male');
2.unique唯一
同一字段内或多个字段内数据不能出现重复,只能有唯一
# 单列唯一
create table t3(
id int unique,
name char(24)
);
insert into t3 values(1,'json');
insert into t3 values(1,'angle'); #报错
## 多列唯一
create table t4(
id int,
ip char(24),
port int,
unique(ip,port)
);
insert into t4 values(1,'127.0.0.1','8080');
insert into t4 values(2,'127.0.0.1','8081');
insert into t4 values(3,'127.0.0.2','8081');
3.primary key(主键)
1.从约束的效果来看,主键等价于unique+not null;
非空且唯一
我们常常用key来约束数据的ID字段,因为ID字段标识了独一无二的一行数据;
create table t5(id int primary key);
insert into t5 values(1),(1);
insert into t5 values(null);
insert into t5 values(1),(2);
2.除了有约束的作用以外主键是innodb引擎组织文件的依据,Innodb引擎在创建的时候必须要有主键,因为他类似书的目录,能够帮助提示查询效率并且也是建立表的依据
# 1.如果没有主键,非空且唯一的字段自动升级为主键
create table t6(id int,name char(24) not null unique,sex varchar(24));
# 2.如果没有主键,也没有非空且唯一的字段,那么innodb会自动创建一个隐藏的字段作为组织表的依据
# 3.一张表应该且只有一个主键(通常用id,udi,sid等)
# 单个字段主键
create table t7(id int primary key,name char(24));
create table t8(id int ,name char(24),primary key(id));
# 多个字段联合主键(注:视作一个主键)
create table t9(id int,ip char(24),port int,primary key(ip,port));
在创建任何一张表的时候,都应该有主键!!!!
4.auto_increment
1.在数据量过大的时候,操作十分繁琐,auto_increment可以自增ID,这样创建表的时候就比较方便了
create table t10(id int primary key auto_increment,name char(24));
insert into t10(name) values('egon'),('sb');
2.这种方法是专门服务于主键的,如果用于其他则会报错;
create table t11(
id int primary key auto_increment,
name char(16),
cid int auto_increment
);
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
结论:创建表的完整语法
create table t1(id int primary key auto_increment,.....);
注意:
1.对于auto_increment,不会因为delete from的执行而智能跟随,而是会创建时候继续加1
2.使用truncare t1 则会清空表以及各式
表与表之间的关系
1.为什么会出现表关系?
1.信息都存在一张表中,使表信息结构不明确
2.浪费硬盘空间
3.可拓展性差
2.什么是外键
外键是指将两张表产生关系的一种语法
一般写法为 foregin key(字段名) reference 表名(字段名);
3.表有哪些关系
1.一对多
2.多对多
3.一对一
4.没有关系
4.如何判断表的关系
换位思考
先站在一方思是否能够与多个数据建立关系
再站在另外一方思考是否能够与多个数据建立关系
5.如何创建表关系
1.字段在哪一方
一对多的关系,在多的一方
多对多的关系,在第三方
一对一的关系,在使用频率较高的一方
2.在创建关系之前必须先创建被关联的表
3.在录入数据是必须先录入被关联表中的数据
6.一对多关系
例:员工部门表
create table dep(
id int primary key auto_increment,
department char(24)
);
create table emp(
id int primary key auto_increment,
name char(24),
sex enum('female','male','others') default 'female',
dep_id int,
foreign key(dep_id) references dep(id)
);
insert into dep values('财务部'),('技术部'),('后勤部');
insert into emp(name,sex,dep_id) values('egon','female',1),('alex','male',2),('jason','others',2);
问题:
当我们delete或则update被关联数据的时候不让我们操作
on delete cascade
on update cascade
这样当删除或者更新被关联表的时候更改可以成功且关联表也同样执行删除和更新操作
create table dep(
id int primary key auto_increment,
department char(24)
);
create table emp(
id int primary key auto_increment,
name char(24),
sex enum('female','male','others') default 'female',
dep_id int,
foreign key(dep_id) references dep(id)
on delete cascade
on update cascade
);
insert into dep(department) values('财务部'),('技术部'),('后勤部');
insert into emp(name,sex,dep_id) values('egon','female',1),('alex','male',2),('jason','others',2);
7.多对多关系
针对多对多的表关系,我们需要引入第三张表间接的上两张表相互的关联
# 图书表和作者表
create table book(
bid int primary key auto_increment,
name char(24) not null
);
create table author(
aid int primary key auto_increment,
name char(24) not null
);
create table book2author(
id int primary key auto_increment,
book_id int,
author_id int,
foreign key(book_id) references book(bid)
on delete cascade
on update cascade,
foreign key(author_id) references author(aid)
on delete cascade
on update cascade
);
insert into book(name) values('猪头'),('二十'),('彼方');
insert into author(name) values('egon'),('alex'),('jason');
insert into book2author(book_id,author_id) values(1,1),(1,2),(1,3),(2,3)
8.一对一关系
一对一关系就是在使用外键的时候对建立方进行约束:
即unique+foreign key
建立方通常是查询频率较高的一方
QQ基本信息与详情信息
create table base(
bid int primary key auto_increment,
name char(24),
detail_id int unique,
foreign key(detail_id) references detail(did)
);
create table detail(
did int primary key auto_increment,
age char(3),
phone char(11),
address char(40)
);
insert into detail(age,phone,address) values('11','1213','123123'),('22','12312','1231123');
insert into base(name,detail_id) values('猪八戒',1),('疯狗',2);
# 此时会报错,原因在于外键需优先创立所指向的表