46、表与表的连接
一、主键 primary key
1.1、从约束条件上看,等同于not null+unique:非空且唯一
create table t1(id int primary key)
1.2、主键除了有约束效果外,还是innodb存储引擎组织数据的依据
innodb存储引擎在创建表的时候必定会有primary key,相当于表内的索引,通常在id字段放置,可以快速的找到需要的信息
1.2.1、当表内没有主键 primary key时
当表内找不到任何关于非空且唯一字段时,innodb存储引擎会在自己内部提供一个他隐藏的非空且唯一的字段,但是我们无法找到他。
1.2.2、当表内没有primary key,但是有not null unique时,
innodb存储引擎会按照从上到下找到第一个not null unique ,并将它设置成主键
1.2.3、当表内有且只有一个primary key时
通常primary key是以id/uid/sid字段作为主键
1.2.4、联合主键
将多个字段联合起来作为主键,本质也是一个主键:primary key (ip,port)
二、自增 auto_increment
自动增加序号,只能给主键添加,可以避免不断地输入序号
create table t1(id int primary key auto_increment, name char(16));' insert into t1(name) values('jason'),('egon');
三、表与表之间的关系
为避免表结构的数据扩展性差,浪费空间,组织结构不清晰,因此可以将一个表进行拆解,并将其进行关联。
表的关系分为四种,分别是:一对多关系,多对多关系,一对一关系,没有关系
3.1、外键 foreign key
外键就是连接将表与表关联在一起:foreign key
3.2、一对多关系
将一张表进行分解成两张,其中一张数据相对比较单一,一张数据相对比较复杂,复杂的包含在单一的里面就像一个集合,例如一个部门有多个员工,多的就是员工,单一的就是部门。
foreign key:1.设置在复杂的一方,也就是关联表,而少的就是被关联表
2.创建表的时候需要先建立被关联表
3.录入数据是,也要先录入被关联表
由于删除和修改表内的数据,需要先删除关联表内数据,再删除被关联表内数据,所以有了同步更新和同步删除
同步更新:on update cascade
同步删除:on delete cascade
create table dep( id int primary key auto_increment, dep_name char(16), dep_desc chjar(32) ); create table emp( id int primary key auto_increment, name char(16), gender enum('male','female','others'), def_id int, foreign key(dep_id) references dep(id) on update cascade#同步更新 on delete cascade#同步删除 ); insert into dep(dep_name,dep_desc) values('教学部','教育人'),('技术部','搞研究'); insert into emp(name,def_id) values('Jason',1),('egon',2),('tank',2)
3.3、多对多关系
多对多关系需要建立一张第三方的表,将两张表进行关联
create table book( id int primary key auto_increment, title varchar(32), price int ); create table author( id int primary key auto_inceement, name varchar(32), age int ); craeate table book_and_author( id int primary key auto_increment, author_id int, book_id int, foreign key(author_id) references author(id) on update cascade #同步更新 on delete cascade #同步删除 foreign key(book_id) references book(id) on update cascade #同步更新 on delete cascade #同步删除 )
3.4、一对一关系
当字段比较多时,可以将一张表拆成两张一对一的表,外键字段建议建立在使用频率比较高的表中
create table authordetail( id int primary key auto_increment, phone int, addr varchar(64) ); create table author( id int primary key auto_increment, name varchar(32), age int, authordetail_id int unique, foreign key(authordetail_id) references authordetail(id) on update cascade on delete cascade )
四、修改表
4.1、修改表名
alter table 表名 rename 新表名
4.2、增加字段
alter table 表名 add 字段名 字段类型(宽度) 约束条件;
alter table 表名 add 字段名 字段类型(宽度) 约束条件 first;
alter table 表名 add 字段名 字段类型(宽度) 约束条件 after 字段名;
4.3、删除字段
alter table 表名 drop 字段名;
4.4、修改字段
alter table 表名 modify 字段名 字段类型(宽度) 约束条件;
alter table 表名 change 旧字段名 新字段名 字段类型(宽度) 约束条件;
五、复制表
由于SQL语句查询的是一张虚拟表,只能复制旧表,不能复制主键以及外键
create table 表名 select * from 旧表;
create table new_dep2 select * from dep where id >3;