• day46---MySQL数据库进阶(一)


    MySQL数据库进阶(一)

    常见的约束条件

    not null
    unsigned
    zerofill
    

    default默认值

    # 创建学生信息表
    create table student_info(
        id int primary key auto_increment,
        name varchar(16) not null,
        gender enum('female','male') default 'male',
        age int,
        hobby set('read','write','sleep')
    );
    
    insert into student_info values(1,'egon','female',73,'read,sleep');
    # 指定字段插入数据
    insert into student_info(name,age,hobby) values('jason',18,'read'),('tank',18,'write');
    

    unique唯一键

    """
    单列唯一:比如学生的id
    联合唯一:比如标识一台计算机上独一无二的应用程序(ip,port)
    
    #action:联合唯一中的元素,单个可以重复,但是联合起来的对象必须是唯一的
    """
    
    • 单列唯一
    # 创建课程表
    create table course_info(
        id int unique,
        name varchar(16) not null,
        price int not null
    );
    
    insert into course_info values(1,'数据分析',28000),(2,'python全栈',20000);
    

    • 联合唯一
    # 创建应用程序表
    create table application_info(
        id int primary key auto_increment,
        name varchar(16) not null,
        ip varchar(16),
        port int,
        unique(ip,port)
    );
    
    insert into application_info(name,ip,port) values('mysql_129','192.168.80.129',9090),('tomcat_129','192.168.80.129',8080),('mysql_128','192.168.80.128',9090);
    

    primary key主键

    """
    1、从约束效果上来看primary key 等价于 (not null+unique)
    """
    
    create table beast_info(
        id int primary key auto_increment,
        name varchar(32) not null,
        gender enum('female','male')
    );
    

    """
    2、primary key 是Innodb存储引擎组织数据的依据
    # Innodb存储引擎在创建表的时候必须要有primary key
    因为它类似于书的目录 能够帮助提示查询效率并且也是建表的依据
    """
    (1)一张表有且只有一个主键,如果没有设置主键,Innodb存储引擎会从上往下搜索,直至遇到一个非空且唯一的字段,将其升级为主键
    exp:
        create table teacher(
            id int not null unique,
            name varchar(16) not null,
            address varchar(32) not null unique
        );
    

    """
    3、 如果表中没有主键也没有其他任何的非空且唯一字段 那么Innodb会采用自己内部提供的一个隐藏字段作为主键,隐藏意味着你无法使用到它 就无法提示查询速度
    """
    

    一张表中通常有一个主键字段,通常都是将id、uid、sid作为主键

    • 单个主键字段
    create table class_info(
        id int primary key auto_increment,
        name varchar(32) not null,
        address varchar(32)
    );
    
    insert into class_info(name,address) values('魔都校区','上海'),('紫金校区','南京'),('帝都校区','北京');
    

    • 联合主键字段
    create table stu_info(
        stu_id int,
        stu_name varchar(32),
        gender enum('female','male') default 'male',
        hobby set('read','sleep'),
        primary key(stu_id,stu_name)
    );
    
    insert into stu_info(stu_id,stu_name,hobby) values(1,'马林','sleep'),(2,'马林','read');
    

    • auto_increment自增
    """
    1、当编号特别多的时候 人为的去维护太麻烦
    2、auto_increment通常都是加在主键上的 不能给普通字段加
    """
    

    结论

    """
    1、以后在创建表的id(数据的唯一标识id、uid、sid)字段的时候
    id int primary key auto_increment
    """
    # 补充
    delete from t1  删除表中数据后 主键的自增不会停止
    
    truncate t1  清空表数据并且重置主键
    

    表与表之间的关系

    表与表之间通常有以下的4种关系:

    """
    1、一对多(多对一)
    2、多对多关系
    3、一对一关系
    4、没有关系
    """
    

    我们通过外键来维系(建立)表与表之间的关系

    # 外键(foreign key)
    外键的作用:
    """
    1、使表的组织结构变得清晰
    2、节约硬盘空间
    3、增强数据的可扩展性
    """
    
    一对多关系
    exp:
        员工表与部门表
        """
        一个部门可以有多个员工,但是一个员工只能有一个部门
        员工与部门之间的关系是单向的“一对多”关系
        """
    foreign key:
        1、一对多表关系,外键字段建在多的一方
        2、在创建表的时候,一定要先建被关联表
        3、在录入数据的时候,也要先录入被关联表
    
    # 部门表
    create table dep_info(
        id int primary key auto_increment,
        dep_name varchar(32) not null,
        dep_desc varchar(32)
    );
    
    # 员工表
    create table emp_info(
        id int primary key auto_increment,
        name varchar(32) not null,
        gender enum('female','male') default 'male',
        dep_id int,
        foreign key(dep_id) references dep_info(id)
    );
    
    insert into dep_info(dep_name,dep_desc) values('教学部','教书育人'),('技术部','you can you up'),('外交部','多人运动');
    
    insert into emp_info(name,dep_id) values('jason',3),('egon',1),('tank',2);
    

    思考

    """
    1、能否修改dep表里面的id字段? 不能
    2、能否删除dep表里面的数据?   不能
    """
    

    解决方案

    """
    1、先删除教学部对应的员工数据 之后再删除部门(操作繁琐)
    2、使用级联同步更新、同步删除
    """
    """
    on update cascade
    on delete cascade
    """
    
    # 部门表
    create table dep_info(
        id int primary key auto_increment,
        dep_name varchar(32) not null,
        dep_desc varchar(32)
    );
    
    # 员工表
    create table emp_info(
        id int primary key auto_increment,
        name varchar(32) not null,
        gender enum('female','male') default 'male',
        dep_id int,
        foreign key(dep_id) references dep_info(id)
        on update cascade # 级联更新
        on delete cascade # 级联删除
    );
    
    多对多关系
    exp:
        图书表与作者表
        """
        一本图书可以有多个作者
        一个作者可以有多个著作
        图书与作者之间是双向的“一对多”关系
        """
        
    # 需要新建一张表来分别维系(建立)两者的一对多关系,两者并不直接建立关系
    
    """
    book
    author
    book_link
    """
    
    # 创建书籍表
    create table book_info(
        book_id int primary key auto_increment,
        title varchar(32) not null,
        price int
    );
    
    # 创建作者表
    create table author_info(
        author_id int primary key auto_increment,
        author_name varchar(32) not null,
        age int,
        address varchar(32)
    );
    
    # 创建联系表
    create table book_link_author(
        id int primary key auto_increment,
        book_id int not null,
        author_id int not null,
        foreign key(book_id) references book_info(book_id)
        on update cascade
        on delete cascade,
        foreign key(author_id) references author_info(author_id)
        on update cascade
        on delete cascade
    );
    
    insert into book_info(title,price) values('富婆挑战记录',1000),('egon与tank',1024),('雨后情缘',2048);
    
    insert into author_info(author_name,age,address) values('egon',73,'山东'),('jason',18,'虹桥'),('wusir',88,'北京');
    
    insert into book_link_author(book_id,author_id) values(1,1),(1,2),(2,1),(2,3),(3,2),(3,3);
    

    一对一关系

    如果一个表的字段特别多 ,每次查询又不是所有的字段都能用得到可以将表一分为二 ,如用户表与用户详情表

    """
    一张用户表能否对应多个用户详情表?  不能
    一张用户详情表能否对应多张用户表?  不能
    """
    
    # 创建用户详情表
    create table user_detail(
        id int primary key auto_increment,
        name varchar(32),
        age int,
        gender enum('male','female') default 'male',
        address varchar(32)
    );
    
    # 创建用户表
    create table user(
        user_id int primary key auto_increment,
        user_account varchar(32) not null,
        user_password varchar(32) not null,
        user_detail_id int not null,
        foreign key(user_detail_id) references user_detail(id)
        on update cascade
        on delete cascade
    );
    
    insert into user_detail(name,age,address) values('egon',78,'山东'),('jason',18,'安徽'),('tank',18,'广东');
    
    insert into user(user_account,user_password,user_detail_id) values('dsb001','sucess',1),('qb002','334256',2),('dsb010','kingstar',3);
    

    总结

    表关系的建立需要用到foreign key
    	一对多
    		外键字段建在多的一方
    	多对多
    		自己开设第三张存储
    	一对一
    		建在任意一方都可以 但是推荐你建在查询频率较高的表中
    

    修改表(了解)

    mysql对大小写不敏感

    1. 修改表名
    alter table 表名 rename 新表名;
    mysql> alter table teacher rename teacher_info;
    
    1. 增加字段
    alter table 表名 add 字段名 字段类型(宽度) 约束条件;
    alter table 表名 add 字段名 字段类型(宽度) 约束条件 first;
    alter table 表名 add 字段名 字段类型(宽度) 约束条件 after 字段名;
    
    mysql> alter table student10
        -> add name varchar(20) not null,
        -> add age int(3) not null default 22;
    
    mysql> alter table student10
        -> add stu_num varchar(10) not null after name;                //添加name字段之后
    
    mysql> alter table student10                        
        -> add sex enum('male','female') default 'male' first;          //添加到最前面
    
    1. 删除字段
    alter table 表名 drop 字段名;
    mysql> alter table student10
        -> drop sex;
    
    mysql> alter table service
        -> drop mac;
    
    1. 修改字段
    alter table 表名 modify 字段名 字段类型(宽度) 约束条件;
    mysql> alter table student10
        -> modify age int(3);
    mysql> alter table student10
        -> modify id int(11) not null primary key auto_increment;    //修改为主键
        
    alter table 表名 change 旧字段名 新字段名 字段类型(宽度) 约束条件;
    

    复制表(了解)

    • 复制表结构+记录(key不会复制: 主键、外键和索引)
    mysql> create table new_service select * from service;
    
    • 只复制表结构
    mysql> select * from service where 1=2;        //条件为假,查不到任何记录
    Empty set (0.00 sec)
    mysql> create table new1_service select * from service where 1=2;  
    Query OK, 0 rows affected (0.00 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> create table t4 like employees;
    

    删除表

    DROP TABLE 表名;
    mysql> drop table user;
    

    参考链接:https://zhuanlan.zhihu.com/p/113334455

  • 相关阅读:
    skynet源代码学习
    白话经典算法系列之七 堆与堆排序
    数据结构与算法二
    [hadoop系列]Pig的安装和简单演示样例
    感动前行——给医学媳妇写的演讲稿(非IT类)
    怎样提高团队管理能力3
    Linux守护进程的编程实现
    人脸识别 开放书籍 下载地址
    Objective-C中经常使用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect
    动态规划整理(两)
  • 原文地址:https://www.cnblogs.com/surpass123/p/12831238.html
Copyright © 2020-2023  润新知