• 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;

  • 相关阅读:
    java算法集训结果填空题练习2
    java算法集训结果填空题练习1
    java算法集训结果填空题练习1
    java算法集训结果填空题练习1
    java算法集训结果填空题练习1
    java算法集训结果填空题练习1
    java算法集训代码填空题练习3
    java算法集训代码填空题练习3
    java算法集训代码填空题练习3
    java算法集训代码填空题练习3
  • 原文地址:https://www.cnblogs.com/jingpeng/p/12833800.html
Copyright © 2020-2023  润新知