8.19MySQL(二)

一、存储引擎

  不同的数据应该有不同的处理机制

1.mysql存储引擎

  Innodb:默认的存储引擎,查询速度较myisam慢,但是更安全

  myisam:mysql老版本用的存储引擎

  memory:内存引擎(数据全部存在内存中)

  blackhole:无论存什么,都立马消失(黑洞)

2.查看所有的存储引擎

  show engines;

3.研究一下每个存储引擎存取数据的特点

(1)Innodb:两个文件,一个是表结构文件,一个是真实数据文件

(2)myisam:三个文件,表结构文件,真实数据文件,索引文件(目录)

(3)memory:一个文件,表结构文件

(4)blackhole:一个文件,表结构文件

二、创建表的完整性约束

1.创建表的完整语法

create table 表名(
            字段名1 类型[(宽度) 约束条件],
            字段名2 类型[(宽度) 约束条件],
            字段名3 类型[(宽度) 约束条件]
            );

注意:

  (1)字段名和字段类型是必须的  中括号内的参数都是可选参数

  (2)同一张表中字段名不能重复

  (3)最后一个字段后面不能加逗号,例如:

create table t6(
    id int,
    name char,
    );  # 错误

宽度:

  (1)使用数据库的准则:能尽量让它少干活就尽量少干活

  (2)对存储数据的限制:char(1),只能存一个字符

      1.如果超了,mysql会自动帮你截取

      2.会直接报错(mysql严格模式)

类型和中括号内的约束条件有什么区别:

  类型约束的是数据的存储类型

  而约束条件是基于类型之上的额外限制

2.约束条件:如何限制一个字段不能插空

  alter table t5 modify name char not null;

  not null 约束条件,该字段不能插空

三、严格模式

  我们刚刚在上面设置了char,tinyint,存储数据时超过它们的最大存储长度,发现数据也能正常存储进去,只是mysql帮我们自动截取了最大长度。但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,让它仅仅只管理数据即可,这样的情况下就需要设置安全模式

1.模糊匹配

  like

    %匹配任意多个字符

    _匹配任意一个字符

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

2.修改严格模式

  set session:临时有效,只在你当前操作的窗口有效

  set global:全局有效,终生有效

    set global sql_mode = 'STRICT_TRANS_TABLES';

  修改完之后退出当前客户端重新登陆即可

四、字段类型

1.整型

  SMALLINT、TINYINT、INT、BIGINT

TINYINT

  create table t6(id TINYINT);

  默认是带有符号的(-128,127)

  超出之后只会存最大值或者最小值

怎样改成无符号

  alter table t6 modify id TINYINT unsigned;

  就改成无符号的(0,255)

INT

  也是默认带有符号的

  超出之后只会存最大值或者最小值

  改成无符号与上方法一致

括号内的数字

char后面的数字是用来限制存储数据的长度的

特例:

只有整型后面的数字不是用来限制存储数据的长度,而是用来控制展示的数据的位数

int(8):够/超8位有几位存几位,不够8位空格填充

zerofill:修改约束条件,不够8位的情况下,用0填充

强调:

***对于整型来说,数据类型后的宽度并不是存储限制,而是显示限制,所以在创建表时,如果字段采用的是整型类型,完全无需指定显示宽度, 默认的显示宽度,足够显示完整当初存放的数据

只要是整型,都不需要指定宽度,因为有默认的宽度,足够显示对应的数据

约束条件:

  not null       不能为空

  unsigned    无正负符号

  zerofill      0填充多余的位数

2.浮点型

  float(255,30):总共255位,小数部分占30位

  double(255,30):总共255位,小数部分占30位

  decimal(65,30):总共65位,小数部分占30位

  前一位表示所有的位数,后一位表示小数个数

精确度

  验证

create table t12(id FLOAT(255,30));
create table t13(id DOUBLE(255,30));
create table t14(id DECIMAL(65,30));
        
insert into t12 values(1.111111111111111111111111111111);
insert into t13 values(1.111111111111111111111111111111);
insert into t14 values(1.111111111111111111111111111111);

  精确度:float < double < decimal

3.字符类型

  char(4):最大只能存四个字符,超出来会直接报错,如果少了,会自动用空格填充

  varchar(4):最大只能存四个字符,超出来会直接报错,如果少了,有几个存几个

create table t15(name char(4));
create table t16(name varchar(4));

  char_length():获取一个字符的长度

  mysql在存储char类型字段的时候,硬盘上确确实实存的是固定长度的数据,但是在取出来的那一瞬间,mysql会自动将填充的空格去除

  可以通过严格模式,来修改该机制,然后退出客户端重新登陆,这样mysql就不做自动去除末尾空格的操作,

set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";

char与varchar的使用区别

name char(5):char定长

  优点:存取速度都快

  缺点:浪费空间

name varchar(5):varchar变长

  优点:节省空间

  缺点:存取速度慢(较于char比较慢)

      存的时候,需要给数据讲一个记录长度的报头

      取的时候,需要先读取报头才能读取真实数据

4.日期类型

  date:2019-05-01  年月日

  datetime: 2019-01-02 11:11:11  年月日时分秒

  time:11:11:11  时分秒

  year:2019  年

测试:

create table student(
    id int,
  name char(16),
  born_year year,
  birth date,
  study_time time,
  reg_time datetime
);
insert into student values(1,'egon','2019','2019-05-09','11:11:00','2019-11-11 11:11:11');

5.枚举与集合类型

分类

  枚举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')  # 正确!

create table teacher( id int, name char(16), gender enum('male','female','others'), hobby set('read','sleep','sanna','dbj') ); insert into teacher values(1,'egon','male','read,sleep,dbj') # 集合也可以只存一个

五、约束条件

1.not null:不能为空

2.default:给某个字段设置默认值(当用户写了的时候用用户的,当用户没有写就用默认值)

  create table t17(id int,name char(16) default 'jason');

往表中插入数据的时候,可以指定字段进行插入,不需要全部都插入

  insert into t17(name,id) values('egon',2);

3.unique:唯一

  单列唯一:限制某一个字段是唯一的

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);

4.primary key:主键

  限制效果跟 not null + unique 组合效果一致,非空且唯一

create table t11(id int primary key);
desc t11;
insert into t11 values(1),(1);  # 报错
insert into t11 values(1),(2);

  primary key也是innodb引擎查询必备的索引

innodb引擎在创建表的时候,必须要有一个主键

当你没有指定主键的时候

  1.会将非空且唯一的字段自动升级成主键

  2.当你的表中没有任何的约束条件,innodb会采用自己内部默认的一个主键字段

    该主键字段你在查询时候是无法使用的

    查询数据的速度就会很慢

    类似于一页一页的翻书

create table t12(
    id int,
  name char(16),
  age int not null unique,
  addr char(16) not null unique
);

主键字段到底该设置给谁

  通常每张表里面都应该有一个id字段

  并且应该将id设置为表的主键字段

联合主键

  ***多个字段联合起来作为表的一个主键,本质还是一个主键***

  ***PS:innodb引擎中一张表有且只有一个主键***

主键字段应该具备自动递增的特点:primary key auto_increment

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

  每次添加数据,不需要用户手动输入

  auto_increment:自动递增

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

补充:

delete from t21;  仅仅是删除数据,不会重置主键

  这条命令确实可以将表里的所有记录都删掉,但不会将id重置为0,所以收该条命令根本不是用来清空表的,delete是用来删除表中某一些符合条件的记录

truncate t21;  初始化表,会重置主键

  将整张表重置,id重新从0开始记录

原文地址:https://www.cnblogs.com/francis1/p/11379945.html