• MySQL进阶part2


    约束条件

    unique——唯一

    # 单列唯一
    create table t3(
    id int unique,
        name char(16)
    );
    insert into t3 values(1,'jason'),(1,'egon');
    insert into t3 values(1,'jason'),(2,'egon');
    # 联合唯一(两个分开都可以重复 但是加载一起必须是唯一的)
    create table t4(
    id int,
        ip char(16),
        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',8080);
    insert into t4 values(4,'127.0.0.1',8080);  报错

    primary key 主键(非空切唯一)

    create table t5(id int primary key);
    insert into t5 values(null); # 错误
    insert into t5 values(1),(1); # 重复错误
    insert into t5 values(1),(2);
    ps:在创建表的时候id字段一定要加primary key

    auto_increment(自增)

    # 编号太多的情况下适用
    create table t8(
    id int primary key aotu_increment,
    name char(16)
    );
    ps:
    在创建表的时候id字段一定要加primary key aotu_increment
    delete 删除表中的数据之后 主键的自增不会归零
    truncate t8 可以清空数据,并且重置主键

    表和表之间的关系

    问题:在一张员工信息表中 有许多字段
    id name gender dep_name dep_desc
    如何优化其扩展性
    解决方案——拆分
    外键
    帮助我们建立表与表之间的关系
    foreign key
    表的关系
    1.一对多
    2.多对多
    3.一对一
    4.无关
    ps:如何判断两张表的关系

    换位思考——站在两张表的角度思考

    员工表与部门表为例
    先站在员工表
    思考一个员工能否对应多个部门(一条员工数据能否对应多条部门数据)
    不能!!!
    (不能直接得出结论 一定要两张表都考虑完全)
    再站在部门表
    思考一个部门能否对应多个员工(一个部门数据能否对应多条员工数据)
    能!!!
    得出结论
    员工表与部门表示单向的一对多
    所以表关系就是一对多

    • 一对多关系

    foreign key
    1.外键字段建立在多的一方(使用的次数多)
    2.在创建时期 先创建被关联的表
    3.录入数据时期 也录入被关联的表
    # 先创被关联的表
    create table dep(
    id int primary key aotu_increment,
    dep_name char(16),
    dep_desc char(32)
    );

    # 再创关联表
    create table emp(
    id int primary key aotu_increment,
    name char(16),
    gender enum('male','famale') default'male',
    foreign key(dep_id) referrences dep(id)
    );

    # 先录入被关联的表
    insert into dep(dep_name,dep_desc) values('sb教学部','教书育人'),('外交部','多人外交'),('nb技术部','技术能力有限部门');
    # 再录入员工表
    insert into emp(name,dep_id) values('jason',2),('egon',1),('tank',1),('kevin',3);
    ps:在关联了表关系之后,不可以修改被关联的数据的字段
    如需要修改,需要先删除被关联数据(教学部)对应的数据(教学部的员工数据)再删除部门数据。

    级联更新 >>> 同步更新 级联删除 >>> 同步删除

    create table dep(
    id int primary key auto_increment,
        dep_name char(16),
        dep_desc char(32)
    );
    create table emp(
    id int primary key auto_increment,
        name char(16),
        gender enum('male','female','others') default 'male',
        dep_id int,
        foreign key(dep_id) references dep(id)
        on update cascade  # 同步更新
       on delete cascade  # 同步删除
    );
    insert into dep(dep_name,dep_desc) values('sb教学部','教书育人'),('外交部','多人外交'),('nb技术部','技术能力有限部门');
    insert into emp(name,dep_id) values('jason',2),('egon',1),('tank',1),('kevin',3);
    • 多对多关系

    # 图书和作者表
    create table book(
    id int primary key aotu_increment,
    title varchar(16),
    price int,
    author_id int,
    foreign key(author_id) references author(id)
    on updata cascade
    on delete cascade
    );
    create table author(
    id int primary key auto_increment,
        name varchar(32),
        age int,
        book_id int,
        foreign key(book_id) references book(id)
        on update cascade  # 同步更新
       on delete cascade  # 同步删除
    );
    """
    按照上述的方式创建 一个都别想成功!!!
    其实我们只是想记录书籍和作者的关系
    针对多对多字段表关系 不能在两张原有的表中创建外键
    需要你单独再开设一张 专门用来存储两张表数据之间的关系
    """
    create table book(
    id int primary key auto_increment,
        title varchar(32),
        price int
    );
    create table author(
    id int primary key auto_increment,
        name varchar(32),
        age int
    );
    create table book2author(
    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  # 同步删除
    );
    • 一对一关系

    """
    id name age addr phone hobby email........
    如果一个表的字段特别多 每次查询又不是所有的字段都能用得到
    将表一分为二 
    用户表
    用户表
    id name age
    用户详情表
    id addr phone hobby email........

    站在用户表
    一个用户能否对应多个用户详情   不能!!!
    站在详情表
    一个详情能否属于多个用户     不能!!!
    结论:单向的一对多都不成立 那么这个时候两者之间的表关系
    就是一对一
    或者没有关系(好判断)

    客户表和学生表
    在你们报名之前你们是客户端
    报名之后是学生(期间有一些客户不会报名)
    """

    一对一 外键字段建在任意一方都可以 但是推荐你建在查询频率比较高的表中
    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  # 同步删除
    )

  • 相关阅读:
    flexbox 伸缩布局盒
    border-radius 知识点
    appium+Python第一个unitest
    linux常用命令整理
    appium的demo编程
    appium+Python环境搭建
    pycharm将py文件打包成可执行文件exe
    jmeter线程组设置
    jmeter的如何设置headers
    Python使用pillow的坑
  • 原文地址:https://www.cnblogs.com/bailongcaptain/p/12833916.html
Copyright © 2020-2023  润新知