数据类型与约束条件

数据类型与约束条件

一、存储引擎

存储引擎:是用于根据不同的机制处理不同的数据

[https://images2015.cnblogs.com/blog/1036857/201707/1036857-20170720175637911-1251772910.png]

  • 查看mysql中所有引擎
    • show engines;
  • myisam:5.5以前老版本使用的存储引擎
    • mysql> create table t1(id int)engine=myisam;
  • blackhole:类似于队列中的数据,存进去消失
    • mysql> create table t2(id int)engine=blackhole;
  • innodb:默认使用存储引擎
    • mysql> create table t3(id int)engine=innodb;
  • memory:通电数据存在,断电丢失
    • mysql> create table t4(id int)engine=memory;

二、创建表完整的语法

create table 表(字段名1 字段类型(宽度)约束条件);

  • 约束条件:可有可无
  1. 宽度指的是对存储数据的限制
    1. 没有安全模式的数据库版本,能够存放数据但只能存进去规定的宽度
    2. 最新数据库的版本直接报错提示无法储存:Data too long for column 'name'
  2. 约束条件:null与not null
    1. create table t1(id int not full, name char); 插入记录时id不能为空
  • 注意
    • 创建表的字段名不能重复 (id int, id int)
    • 最后一个字段不能在末尾加逗号(id int, id int,)
    • 字段名必须要有字段类型与宽度
  • 总结:类型与约束条件区别
    • 类型:限制字段必须以什么样的数据类型存储
    • 约束条件:约束条件是在类型之外添加一种额外的限制

三、基本字段类型

  • 整形

    • 应用场景:id号、年龄...
    • tinyint:默认范围(-128,127)
      • mysql> create table t6(id tinyint, name varchar(16));
    • int:默认范围(-2147483648, 2147483647)
      • 只要字段超过这个范围,则会自动存入这个范围的 最大或最小值
      • int(8)不是限制长度,而是控制数据的位数,8位以内以空格补全,超出则正常显示
      • 默认宽度11
    • bigint
  • 浮点型

    • 应用场景:工资、身高、体重
    • float
      • create table t7(x float(255, 30));
    • double
      • create table t8(x double(255, 30));
    • decimal
      • create table t9(x decimal(65, 30));
    • 范围255是最大长度(包括小数),30 代表的是小数的位数
    • 三种浮点型区别在于:精确度不一样
  • 字符串类型

    • char(16):定长字符
      • char应用场景:手机号、身份证号、银行卡号
      • 插入16个字符
        • create table t10(id int, name char(16));
        • 优点:存取速度快
        • 缺点:浪费空间
    • varchar(16):不定长字符
      • 存入几个字符,就是几个字符的大小,每个字符前都要+1bytes
      • 插入16个字符
      • create table t11(id int, name varchar(16));
      • 优点:节省空间
  • 日期类型

    • date:2019-12-11
    • datetime:2019-12-11 11:11:11
    • time:11:11:11
    • year:2019
    • timestamp:时间戳
    mysql> create table student(id int, name varchar(16), birth date, register datetime, work_
    tme year, t_time time, update_time timestamp);
    Query OK, 0 rows affected (0.52 sec)
    
    mysql> insert into student values(1, '张全蛋', '1990-11-11', '2019-12-11 11:11:11', '2019'
    , '11:11:11', null);
    Query OK, 1 row affected (0.03 sec)

    注意:插入时间数据时,转成str类型

  • 枚举与集合类型

    • 分类

      • enmu枚举:可以多选一
      mysql> create table user1(id int, name varchar(16), gender enum('male','female','other'));
      Query OK, 0 rows affected (0.58 sec)
      # 严格模式下,选择枚举以外的值会报错
      mysql> insert into user1 values(1, 'sean', '人妖');
      Query OK, 1 row affected, 1 warning (0.12 sec)
      
      mysql> insert into user1 values(2, 'tank', 'female');
      Query OK, 1 row affected (0.35 sec)
      
      mysql> select * from user1;
      +------+------+--------+
      | id   | name | gender |
      +------+------+--------+
      |    1 | sean |        |
      |    2 | tank | female |
      +------+------+--------+
      2 rows in set (0.00 sec)
      • set 集合:可 多选一 或 多选多
      mysql> create table user2 (id int, name varchar(16), gender enum('male','female'), hobbies
       set('read','sing','HSNM'));
      Query OK, 0 rows affected (1.37 sec)
      
      # 多选多 
      mysql> insert into user2 values(1, 'sean', 'male', 'read,sing,HSNM');
      Query OK, 1 row affected (0.59 sec)
      
      mysql> select * from user2;
      +------+------+--------+----------------+
      | id   | name | gender | hobbies        |
      +------+------+--------+----------------+
      |    1 | sean | male   | read,sing,HSNM |
      +------+------+--------+----------------+
      1 row in set (0.00 sec)
      

      注意:在写多选时,必须连着写,不可以有空格

四、约束条件

约束条件就是:对于数据库表插入数据时加以约束限制

  • not null:不可设置为空

    • create table user3(id int not null, name varchar(16));
    mysql> create table user3(id int not null, name varchar(16));
    Query OK, 0 rows affected (0.75 sec)
    # 不可设置为null,否则就报错
    mysql> insert into user3 values(null, 'yang');
    ERROR 1048 (23000): Column 'id' cannot be null
    
    mysql> insert into user3 values(1, 'yang');
    Query OK, 1 row affected (0.35 sec)
  • not null + default :设置不为空的默认值

    mysql> create table user5(id int, name varchar(16) not null, gender enum('male','female','
    other') default 'male');
    Query OK, 0 rows affected (0.61 sec)
    
    mysql> insert into user5(id, name) values(1, 'yang');
    Query OK, 1 row affected (0.38 sec)
    
    mysql> select * from user5;
    +------+------+--------+
    | id   | name | gender |
    +------+------+--------+
    |    1 | yang | male   |
    +------+------+--------+
    1 row in set (0.00 sec)
  • unique:将某个资源设置为唯一的值

    • not null + unique
    mysql> create table user4(id int not null unique, name varchar(16));
    Query OK, 0 rows affected (0.31 sec)
    # id 一样的话报错
    mysql> insert into user4(id, name) values(1, 'yang'),(1, 'tank');
    ERROR 1062 (23000): Duplicate entry '1' for key 'id'
    # 正常
    mysql> insert into user4(id, name) values(1, 'yang'),(2, 'tank');
    Query OK, 2 rows affected (0.07 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql> select * from user4;
    +----+------+
    | id | name |
    +----+------+
    |  1 | yang |
    |  2 | tank |
    +----+------+
    2 rows in set (0.00 sec)
    • 联合唯一
      • create table user6(id int, name varchar(16), unique(id, name));
  • primary key + auto_increment:主键+自增

    # 结束角度:primary key == not null + unique
    mysql> create table user6(id int primary key);
    Query OK, 0 rows affected (0.33 sec)
    
    mysql> insert into user6 values(1);
    Query OK, 1 row affected (0.12 sec)
    # 唯一
    mysql> insert into user6 values(1);
    ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
    # 不能为空
    mysql> insert into user6 values(null);
    ERROR 1048 (23000): Column 'id' cannot be null
    # 注意:primary key 除了约束之外,它还是innodb引擎组织数据的一句,提升查询效率
    """
          1.一张表必须只有一个主键,如果没有设置主键,会从上到下搜索,直到遇到"第一个"非空且唯一的字段自动设置为主键
    """
    mysql> create table user7(id int, name varchar(16), age int not null unique)engine=innodb;
    
    Query OK, 0 rows affected (0.58 sec)
    
    mysql> desc user7;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(11)     | YES  |     | NULL    |       |
    | name  | varchar(16) | YES  |     | NULL    |       |
    | age   | int(11)     | NO   | PRI | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    3 rows in set (0.01 sec)
    """
          2.如果包里没有指定任何可以设置主键的字段,那innodb会采用自己默认的一个隐藏关键字作为主键,隐藏意味着查询你的时候通过这个加速查询
          索引:类似于书的目录,没有主键就相当于一页一页翻着查询
    
          3.一张表中通常都应该有一个id字段,并且通常将id字段作为主键
    """
    # 联合主键:多个字段联合起来为一个主键,本质上还是一个主键
    mysql> create table user8(id int, name varchar(16), primary key(id, name));
    # 主键id作为数据的编号,应该设置为自动递增
  • auto_increment:设置自增

    mysql> create table user9(id int primary key auto_increment, name varchar(16));
    Query OK, 0 rows affected (0.54 sec)
    # 自增默认从0开始
    mysql> insert into user9(name) values('yang');
    Query OK, 1 row affected (0.38 sec)
    
    mysql> insert into user9(name) values('tank');
    Query OK, 1 row affected (0.12 sec)
    
    mysql> insert into user9(name) values('sean');
    Query OK, 1 row affected (0.05 sec)
    
    mysql> select * from user9;
    +----+------+
    | id | name |
    +----+------+
    |  1 | yang |
    |  2 | tank |
    |  3 | sean |
    +----+------+
    3 rows in set (0.00 sec)
    mysql> insert into user9 values(10, 'jason');
    Query OK, 1 row affected (0.12 sec)
    
    mysql> insert into user9(name) values('jason1');
    Query OK, 1 row affected (0.04 sec)
    
    mysql> insert into user9(name) values('jason2');
    Query OK, 1 row affected (0.06 sec)
    # 若想自增从指定值开始,可插入第一条数据时先指定id的值;
    mysql> select * from user9;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 | yang   |
    |  2 | tank   |
    |  3 | sean   |
    | 10 | jason  |
    | 11 | jason1 |
    | 12 | jason2 |
    +----+--------+
    6 rows in set (0.00 sec)

    注意: auto_increment通常加在主键上,并且只能设置给primary key字段。

  • unsigned

    • 无符号

      mysql> create table user10(id int unsigned);
      Query OK, 0 rows affected (0.54 sec)
      # 报错
      mysql> insert into user10 values(-100);
      # 正常
      mysql> insert into user10 values(100);
    • 有符号,就使用平时的int 或 bigint

  • zerofill

    • 使用0填充空格

      mysql> create table user11(id int zerofill);
      Query OK, 0 rows affected (0.29 sec)
      
      mysql> insert into user11 values(111);
      Query OK, 1 row affected (0.11 sec)
      
      mysql> select * from user11;
      +------------+
      | id         |
      +------------+
      | 0000000111 |
      +------------+
      1 row in set (0.00 sec)
      
  • 删除记录

    • delete删除表的记录或者指定记录,但是id 不会重置
    • truncate可以删除表记录,而且id会重置为0

总结:

- primary key (pk)
    标识该字段为该表的主键,主键可以是唯一的表示记录
    
- foreign key (fk)
    标识该字段为该表的外键

- not null
    标识该字段不能为空

- unique key (uk)
    标识该字段的值是唯一的

- auto_increment
    标识该字段的值自动增长 (整数类型,并且为主键)

- default
    为该字段设置默认值

- unsigned
    无正负符号

- zerofill
    使用0填充空格

五、设置严格模式

# 查看数据库配置中变量名包含mode的配置参数:
show variables like "%mode%";

# 修改安全模式:
set session;  # 局部有效,只在你当前操作的窗口有效
set global session;  # 全局有效,永久有效

# 修改完之后退出当前客户端重新登录即可
set global sql_mode = 'STRICT_TRANS_TABLES';

猜你喜欢

转载自www.cnblogs.com/YGZICO/p/12030820.html