数据库2

存储引擎:

innodb: 现在数据库使用的默认引擎     与myisam相比,速度较慢,但是数据安全性更高(数据安全体现在行锁, 事务方面)

  使用innodb创建表时,在库下默认创建两个文件,分别是frm和idb, frm表示存储表结构的文件, idb表示存储数据的文件

myisam: 老版本数据库使用的存储引擎

  使用myisam创建表时,在库下默认创建三个文件, 分别是frm  MYD  MYI , frm表示存储表结构的文件, MYD表示存储数据的文件, MYI表示索引文件

blackhole: 黑洞,不管存储什么数据直接丢失

  使用blackhole创建表时,在库下默认创建一个文件, frm , frm表示存储表结构的文件

memory: 内存引擎,临时存储在内存,服务重启数据丢失

  使用memory创建表时,在库下默认创建一个文件, frm, frm表示存储表结构的文件

 

如何查询数据库中有哪些的引擎呢?   show engines;

 

 

创建表的完整性约束:

 

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

 

注意:

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

  2.同一张表中的字段名不能重复

  3.最后一个字段后不能加逗号

宽度:

  对存储数据的限制

  char(1) 只能存储一个字符,如果要存储的字符数超过了char中的限制个数,则mysql会自动截取,mac和mysql5.7及以上版本会报错,因为启用了mysql的严格模式

如何不让用户在字段中插入NULL呢?  如果之前有NULL字段,使用完下面的SQL语句会自动把之前的NULL清空

  

alter  table  表名  modify  字段名  char  not  noll

 

类型和中括号内的约束:

  类型约束的是数据的存储类型, 而约束是基于类型之上的额外限制

 

 

整形类型:

 

更改成无符号

关键字:unsigned

alter  table  表名  modify  id  TINYINT unsigned;

char(8)  : char括号中的数字用来限制储存数据的长度

int(8)  : int括号中的数字用来控制展示的数据的位数, 如果添加的数据不够8位, 则默认使用空格填充到8位, 如果超过8位, 则添加什么数据就显示什么数据.    如何把使用空格填充的改成使用数字0填充呢

关键字: zerofill

create  table  表名  values(id int(8)  zerofill);

强调:

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

 

 

严格模式:

为什么要使用严格模式呢?

  因为在使用char字段类型的时候, 默认为1个字符, 如果插入多个字符, mysql则会自动截取第一个字符直接保存到表中, 但是这时的数据是不正确的,我们使用严格模式就是为了在插入错误的数据时, 让数据库给出报错信息, 可减轻数据库的压力,是一个可以优化数据库的点

如何查看严格模式?

 

show  variables  like  "%mode%";

 

模糊匹配

  关键字:like

    %: 匹配任意多个字符

     _: 匹配任意一个字符

  set session : 修改的严格模式临时有效,只在当前操作的窗口有效

  set  global :  修改的严格模式全局有效,永久有效

set  global  sql_mode = 'STRICT_TRANS_TABLES';

注意: 在修改完严格模式后,需要退出客户端再进入客户端才能生效

 

 

浮点型:

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

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

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

 创建浮点型类型的字段:

create  table  表名  (id  FLOAT(255, 30));
create  table  表名  (id  DOUBLE(255, 30));
create  table  表名  (id  DECIMAL(65, 30));

三者之间的区分就是精确度的问题:

插入数据可查看具体精确度

FLOAT < DOUBLE < DECIMAL

 

 

字符类型:

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

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

  

create  table  表名  (name  char(4))
create  table  表名  (name  varchar(4))

  mysql在存储char类型字段的时候, 硬盘上确确实实存在的是固定长度的数据, 但是在取出来的那一瞬间, mysql会自动将填充的空格去除,那么如何将取出时数据的长度和存入时数据的长度保持一致呢?可以通过修改严格模式, 来不让mysql去做处理, 要写上之前的严格模式

set  global  sql_mode = "strict_trans_tables, PAD_CHAR_TO_FULL_LENGTH"

注意: 需要退出客户端, 重新登陆, 严格模式才能生效

如何查看长度?

select  char_length(name)  from  表名

char和varchar的区别

  char定长:

    1.浪费空间

    2.存取速度快

  varchar变长:

    1.节省空间

    2.存取速度快(较于char)

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

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

 

 

 

枚举与集合:

枚举(enum) : 限制某个字段能够存储的数据内容

集合(set) : 限制某个字段能够存储的数据内容

 

 

约束条件:

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

create  table 表名(id int, name char(16) default 'zhangsan'); 

插入数据

insert into  表名(name, id) vlaues('lisi', 2);

unique : 单列唯一,一般在id标识时使用,id具有唯一性

create table 表名(
    id int unique,
    name char(16)
    )

unique : 联合唯一(在语句的最后,用括号的形式,表示哪几个字段是联合唯一的)

create  table  表名(
    id int,
    ip char(16),
    port int,
    unique(ip, port)
    )

primary key : 主键  (限制效果跟not null + unique 组合效果一致, 非空且唯一)

create  table  表名(id  int  primary key)

primary key 也是innodb引擎查询必备的索引, innodb引擎在创建表的时候,必须要有一个主键

当你没有指定主键的时候

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

  2.当你的表中没有任何的约束条件, innodb会采用自己的内部默认的一个主键字段,该主键字段你在查询时是无法使用的,查询数据的速度就会很慢

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

innodb引擎中一张表有且只有一张主键

create  table  表名(
    ip char(16),
    port int,
    primary key(ip, port)
    );

主键字段应该具备自动递增的特点,每次添加数据,不需要用户手动输入

auto_increment  自动递增

create  table  表名(id int primary key auto_increment, name varchar(16))

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

truncate  表名  (初始化表,会重置主键)

 

posted @ 2019-08-19 21:52  Key丶橙子哥  阅读(168)  评论(0编辑  收藏  举报