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;

 

posted @ 2020-05-05 23:52  疏星淡月  阅读(470)  评论(0编辑  收藏  举报