MySQL 数据类型(整型,浮点型,字符类型,日期类型,枚举和集合) 约束条件 自增

时间:2022-09-21 12:11:03
存储引擎补充:
    不同的应用软件处理不同类型的数据
    MySQL5.5版本及以上默认的存储引擎为innodb
    innodb:支持行锁表锁,外键,事物,安全性更高,教myisam数据更安全
    myisam:仅仅支持表锁不支持行锁,查询速度较innodb更快
    memory:内存引擎,将所有的数据直接放到内存,一旦断电数据全部消失
    blackhole:一切存入其中的数据都会消失

  

创建表的完整语法:
    create table 表名(
     字段名1 类型[(宽度) 约束条件],
     字段名2 类型[(宽度) 约束条件],
     字段名3 类型[(宽度) 约束条件]          
);

创建表时,需要注意:
        1、同一个表内字段名不能重复
        2、字段和类型必须要有,宽度和约束是 可选的
        3、最后一个字段后面不能存在逗号!!!

  

宽度:对存储数据的限制  指的是字符的长度,和字节没关系

create database text:
use text:
create table t1(name char);   此时的char默认长度为1
insert into t1 values('jason');
     #在5.7版本以下可以成功,但是显示只有一位
     #在5.7版本包含自身,会直接报错,这种现象才是正常的


这种情况下,可知当存储数据超过自身最大存储长度时,数据可以正常存储进去,只是MySQL自动截取了最大长度。实际情况下,应该尽量减少数据库的操作,缓解数据库的压力,让其只需要管理数据就可以,这样情况下就需要设置安全模式


可以通过设置安全模式,来处理这一现象:

show variables like '%mode%';  #查看数据库配置中变量 名包含mode的配置参数
  修改安全模式
    set session   #只在 当前操作页面有效    
    set global     #全局有效

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

 

约束条件初始: null 和 not null
create table t1(id int,name char not null);
insert into t1 values(1,'j');  # 正常存储
insert into t1 values(2,null); #报错
insert into t1 values(3,'');    #正常存储

#此处的name只要不为null就可以

类型与约束的区别:
    类型:限制字段必须以什么样的数据类型存储
    约束条件:约束条件是在类型之外添加一种额外的限制

 

基本数据类型

 

整型:

MySQL 数据类型(整型,浮点型,字符类型,日期类型,枚举和集合) 约束条件 自增

 

create database t charset utf8;
use t
create table t1 (x tinyint);    
insert into t1 values(128),(-129);
#tinyint默认情况下是(-128,127),因此实际存入的是127,-128

create table t2 (x tinyint unsigned);
insert into t2 values(-1),(256);
#使用 unsigned ,此时的 取值范围在(0-255),实际存入的数据为0, 255

#在5.7版本以下,设置了与存储长度相关的安全模式以后,只要超出了取值范围,系统会报错!!!


int类型
create table t2(x int(8) unsigned zerofill);
insert into t2 values(1234567890);
#此时不会报错,此处的int(8) 并不是指存储的宽度限制,而是显示限制。即当输入的数据字符数不过8位时,用0来填充,超出了8位正常显示。

强调:当采用int整型时,不需要指定显示宽度,默认显示的宽度,足够显示完整存放的数据。

  

浮点型;
    包含  float double decimal
    应用  身高    体重     薪资

三者最大整数位与小数位对比:

存储限制:
float(255,30)
double(255,30)
decimal(65,30)
逗号前的数字代表最大的存储长度,逗号后面为最大的小数位长度,即整数位长度 为前者减去后者!

精确度验证:
create table t9(x float(255,30));
create table t10(x double(255,30));
create table t11(x decimal(65,30));

精确度: float<double<decimal

  

字符类型

分类: char(定长)   varchar(变长)
作用:姓名,地址,描述类信息


create database gg charset utf8;
create table t12(name char(4));
#输入的数据超过4个就报错,不够四个字符的空格自动补全
create table t13(name varchar(4));
#超过4个字符会报错,不够4个则有几个就存几个

#验证存储限制 
insert into t12 values('hello');
insert into t13 values('hello');
#会直接报错

#验证存储长度
insert into t12 values('a'); #'a   '  存在3个空格,不够无法看出
insert into t13 vallues('a') ; #'a'
select * from t12;
select * from t13;    #结果不能说明什么

select char_length(name) from t12;
select char_length(name) from t13;
#任然无法看到想要的结果,输出长度都是1

解析:硬盘上存储的是真正的数据,但是显示的时候mysql会自动将末尾的空格去掉
如果不想让mysql存在这种操作,可以通过安全模式再设置一次

set global
sal_mode='STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH';
注意:设置完毕以后,需要退出客户端再重新登录
select char_length(name) from t12; #4
select char_length(name) from t13;#1

针对char类型,mysql在存储时会将数据用空格补全到硬盘中,但是会在读出结果的时候自动去掉末尾的空格

  

char与varchar 的区别:
char;
    缺点:浪费时间
    有点:存取速度都快

varchar:
    缺点:存取速度慢
    有点:节省空间


此处节省空间是利用到了给varchar类型的数据加上报头用来标识数据的长度。

  

日期:
    data  年月日
    time  时分秒
    datatime 年月日时分秒
    year   年

例:
create table t15(
            id int,
            birth date,
            class_time time,
            reg_time datetime,
            yy year
            );
insert into t15 values(1,"2000-01-21","11:11:11","2019-01-21 11:11:11","2019");

  

枚举与集合类型:
分类:
    枚举 enum 多选一
    集合  set  多选多

例子:

create table user(
	id int,
  name char(16),
  gender enum('male','female','others')
);
insert into user values(1,'jason','xxx')  # 报错,所输入的数据需要已存在
insert into user values(2,'egon','female')  # 正确!

集合(set):多选多 虽然是多选多但是你可以只选一个
create table t17(
    id int,
    name char(6),
    gender enum('male','female','others'),
    hobby set('read','DJ','DBJ','run')
);          建表时需要规划好数据,后面的才是插入数据
insert into t17 values(1,'tank','male',"read,DBJ,DJ");
insert into t17 values(1,'tank','male',"DBJ");

  

约束条件
"""
PRIMARY KEY (PK)    标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY (FK)    标识该字段为该表的外键
NOT NULL    标识该字段不能为空
UNIQUE KEY (UK)    标识该字段的值是唯一的
AUTO_INCREMENT    标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT    为该字段设置默认值

UNSIGNED 无符号
ZEROFILL 使用0填充
"""

  

not null:限制字段不能为空,即不能输入null这个数据
create table t20(id int,name char(4) not null);

default:设置字段默认值
create table t24(
    id int,
    name char(4),
    gender enum('male','female','others') default 'male'
);
insert into t21 values(1,'egon');  # 报错
insert into t21(id,name) values(1,'egon');
需要把添加的表头写出来

通常情况下not null和default是配合使用的

 

# 单列唯一
create table user1(
	id int unique, 
  name char(16)
);
insert into user1 values(1,'jason'),(1,'egon')  # 报错
insert into user1 values(1,'jason'),(2,'egon')  # 成功

# 联合唯一
create table server(
	id int,
  ip char(16),
  port int,
  unique(ip,port)
)
insert into server values(1,'127.0.0.1',8080);
insert into server values(2,'127.0.0.1',8080);  # 报错
insert into server values(1,'127.0.0.1',8081);

  

主键
单从限制条件上来说,它就相当于not null + unique非空且唯一
create table t26(
            id int primary key,
          name char(16)
    )engine=innodb;

innodb引擎中,所有的表都必须有且只有一个主键,它是innodb引擎用来组织数据的依据

强调(******):
    1.一张表中必须有且只有一个主键,如果你没有设置主键,
    那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键

    create table t25(
        id int,
          name char(16),
          age int not null unique,
          addr char(16) not null unique
    )engine=innodb;
    desc t25;
           #age 与addr都具备主键的潜能,但是先来后到,age拿到了主键


   2.如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键,
   隐藏意味着你在查询的时候无法根据这个主键字段加速查询了
        索引:类似于书的目录,没有主键就相当于一页一页翻着查

    3.一张表中通常都应该有一个id字段,并且通常将改id字段作成主键

  

  

联合主键:本质上还是一个主键:
create table t11(ip char(16),port int,primary key(ip,port));
desc t11;



主键id作为数据的编号,每次最好能自动递增


create table t13(
	id int primary key auto_increment,
  name char(16)
);
insert into t13(name) value('jason'),('jason'),('jason');
  # id字段自动从1开始递增
# 注意:auto_increment通常都是加在主键上,并且只能给设置为key的字段加上。



补充:
    
delete from tb1;
强调:上面的这条命令确实可以将表里的所有记录都删掉,但不会将id重置为0,所以该条命令根本不是用来清空表的,delete是用来删除表中某一些符合条件的记录      delete from tb1 where id > 10;

如果要清空表,使用truncate tb1;
作用:将整张表重置,id重新从0开始记录