数据库建表

  1. 数据的存储方式

    • 数据存储在内存中,也就是说数据断电消失 1个文件:memory
    • 数据存储在硬盘上,也就是说数据持久化存储:innodb,myisam
      • 数据和索引一张表,表结构一张表:innodb(5.6以后mysql的默认存储引擎)
      • 数据和索引不存在一起(索引1个文件,数据1个文件,表结构1个文件):myisam(5.5以前MySQL的默认存储引擎)
  2. 存储引擎介绍:存储数据的方式

    • Innodb存储引擎(2个文件);**MySQL5.6版本后的默认引擎

      • 支持事物:为了保证事物的完整性,把多个操作变成原子性操作。
      • 支持行级锁:修改的行少的时候使用,在修改数据频繁的时候是具有效率优势的
      • 表级锁:批量修改多行的时候使用,对于大量数据同时修改是有好处的
      • 支持外键:约束两张表中的关联字段不能随意的添加或删除,能够极大降低数据增删改的出错率。
    • myisam存储引擎(3个文件),5.5之前默认的,支持表级锁.

    • memory 存储引擎,只存表结构,断电消失

    • 面试题:

      • 你了解MySQL的存储引擎么?你的项目用了什么存储引擎,为什么?
        • 了解一些
        • innodb
        • 多个用户操作的过程中对同一张表的数据同时修改
        • innodb支持行级锁,所有我们使用了这个存储引擎
        • 为了适应程序未来的扩展性,扩展新功能的时候可能会用到。。。。涉及到要维护数据的完整性
        • 项目中有一两张***表,之间的外键关系是什么,一张表的修改或者删除比较频繁,怕出错所有选择了innodb
    • show engines;简单地显示存储引擎

    • 查看引擎:show variables like '%engin%';

    • 查看当前数据库:Select database()

    • 显示表的创建信息:Show create table 表名

  3. 表介绍:

  4. 创建表:

    create table 表名(
    id int primary key auto_increment,
    name char(18),
    ....... 
    )
    
  5. 插入数据的方式

    • insert into student values (2,'wusir'),(3,'hqq'); 插入多条数据
    • insert into student values(值1,值2,值3) 插入单条数据
    • 指定字段名写入:
      • insert into student(字段1,字段2,字段3) values (值1,值2,值3) 指定要插入的字段 插入;
  6. 查看表中数据

    • select * from 表
  7. 查看表结构:

    • desc 表名;(describe)
      • 能够看到有多少个字段,类型,长度,看不到编码,引擎,具体约束信息
    • show create table 表名\G
      • 啥都能看
  8. 表的完整性约束

    • 约束某一个字段

      • 无符号:unsigned

      • 不能为空:not null

      • 默认值是什么:default

      • 唯一约束:unique,值不能重复,但是null可以写入多个。

      • 联合唯一:unique (字段1,字段2)

      • 自增id:auto_increment

        • 至少是unique的约束之后才能自增约束
        • id int primary key auto_increment
      • 主键:primary key

        • 一张表只有一个
        • 如果不指定,默认是第一个非空并且唯一
        • 联合主键 primary key(字段1,字段2)
      • 外键:

        • 学生表

          create table student(
          id int primary key auto_increment,
          name char(12) not null,
          gender enum('male','female') default 'male',
          class_id int,
          foreign key (class_id) references 班级 (cid) on update cascade on delete cascade
          )
          
        
        
      • 班级表

          ~~~
          create table 班级(
          cid int primary key auto_increment,
          cname char(12) not null,
          start_time date
          )
        
        
        
    • 非空+唯一约束:

      • 第一个被定义为非空+唯一的那一列会成为这张表的primary key。
    • 设置主键:primary key id

    • 联合主键;

        - primary key(ip,port)  # 自动会给ip,port设置一个默认default ' '
      
  9. 修改表结构

  10. 删除表:

  • drop 表名
  1. 多表结构的关系分析:

    • 多对一

      • 学生,班级

        • 多个学生是一个班级

        • 学生表有一个外键 关联班级表

      • 书籍 作者

        • 多本书可以是一个作者写的
        • 书籍有一个外键 关联作者表
      • 商品 订单

        • 多个商品可以在一个订单中
        • 商品表有一个外键 关联订单表
      • 书籍 出版社

        • 多本书可以同一个出版社出版的
        • 书籍表有一个外键 关联出版社表
    • 多对多:

      • 学生 班级 多对一
        • 多个学生是一个班级的
      • 班级 学生 多对一
        • 多个班级对应一个学生
      • 出现第三张表
    • 一对一

      • 客户 -- 学生
      • unique foreign key
  2. MySQL中的数据类型:

    • 数字

      • Tinyint 1个字节(256种情况) (-128,127) (0,255) 小正数 ,如果年龄(要unsigned约束)

      • smallint 2个字节

      • mediumint 3字节

      • Int 4个字节 最多表示十位数

      • bigint 8字节

      • float 4 字节

        • float(总位数,小数部分位数)
      • double

        • double(总位数,小数部分位数)
        create table t1(
        	id int,# 默认有符号的,如果需要定义无符号,用unsigned
          age tinyint unsigned
        )
        
        desc t1
        inser into t1 values(1,100)
        
        
      • decimal :精确到小数后20位,总共30位,默认10,0。

    • 字符串

      • char 0-255 定长字符串
        • char(字符个数) 最多只能表示255个字符
        • 定长存储 'hqq' —》'hqq ',节省时间,浪费空间。
      • varchar 0-65535个字符
        • varchar(字符个数)
        • 变长存储 'hqq' —》'hqq4',节省空间,效率低,存取速度慢
      • 什么时候用char 或者varchar?
        • char :
          • 省份证号,手机号,QQ号,username(12-18),password(10-16或32),银行卡号
        • varchar:
          • 评论,朋友圈,微博
    • 时间: 常用的 date time datetime

      • datetime:8字节
        • 20190620121900
      • year:1900-2155 1个字节
      • Date:1000-01-01/9999-12-31 3个字节
        • 20190620
      • time:'-838:59:59'/'838:59:59' 3个字节
        • 121900
      • timestamp 4个字节
        • 1970-01-01 00:00pass
    • enum/set:

      • Enum :单选行为
      • set : 多选行为
  3. 修改表的操作进阶:

    • 修改表名:alter table 表名 rename 新表名
    • 增加字段:alter table 表名 add 字段名 数据类型 [约束条件]
      • alter table 表名 add 字段名 数据类型 after 字段名
      • pass
    • 修改字段:
      • alter table 表名 modify name 要改的类型;
  4. 例子

     create table publish(id int auto_increment primary key,title char(32),addr char(32));
    
     create table test(title char(32),addr char(32));
    
    
posted @ 2020-08-31 22:16  彻底疯狂+100  阅读(186)  评论(0)    收藏  举报