数据库的数据类型和约束条件

存储引擎:

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

mysql存储引擎:

  Innodb:现在版本默认的存储引擎

  myisam:mysql老版本的存储引擎

  memory:内存引擎(数据全部存在内存中)也叫临时的存储引擎

  blackhole:无论存什么,都会立马消失(被称为黑洞引擎)写进去就会消失

每个存储引擎的特点:

  Innodb:支持事务,支持行锁(当一个人在操作这一条数据的时候别人不能操作)。

    使用Innodb建表的时候,它会帮你建两个文件,第一个文件存的是这个表的结构,第二

个文件存的是你的真实的数据,两者是分开的。

  myisam:使用myisam建表的时候,它会帮你建三个文件,第一个文件存的是表结构,第二个存的是真实数据,

第三个文件存的是索引,索引就类似你输得目录,目录能帮你更快速的找到你想要的数据。

  memory:使用memory建表的时候,它只会帮你建一个文件夹,这个文件夹是帮你存表结构的,因为memory

存数据是存在内存中的所以不需要建文件来存数据,所以它只有一个表结构。

  blackhole:使用blackhole建表的时候,它也只会帮你建一个文件夹,因为blackhole的特点是无论存什么都会消失,

所以blackhole也不需要存数据的文件夹。

  当往这些引擎中添入新数据的时候会发现只有使用blackhole所建的表是没有数据的,因为它是黑洞引擎存什么消失什么,

而使用memory引擎间建的表里面虽然能添加新的数据,但是当你重启数据库的时候会发现刚才存的数据消失了,因为memory

存的数据是存在内存当中的,当你应用重启或者关闭的时候它的数据就会消失。

查看所有的存储引擎:

  show engines;

创建表的完整语法:

    create table 表名(

  字段名1 类型[(宽度) 约束条件],

  字段名2 类型[(宽度) 约束条件],

  字段名3 类型[(宽度) 约束条件]
  );

1.字段名和字段类型都是必须的,中括号内的参数都是可选参数,也就是说可写可不写不影响创建

表。如果不写字段名和字段类型会报语法错误。

2.同一张表中,字段名不能重复,最后一个字段内不能加逗号,否则会报错。

char如果不写宽度,默认是1,char的宽度表示的是对存储数据的限制,数字是几只能存几个字符

如果超出了你设置的字符长度,mysql会帮你自动截取。所以使用数据库的准则是:能尽量让他少干活就让他少干活,

采取严格模式。数据库字段允许插空,在数据库里null表示为空,但是如果你不想让它为空,可以使用sql语句限制它不能为空,

语句为:alter table 表名 modify name char not null

当你输入这个语句时之前插入的空值会直接被清除掉

类型和约束条件都是限制数据的,那他们有什么区别呢?

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

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

字段类型:

  整形:SMALLINT(小整形) TINYINT(小型) INT(整型) BIGINT(大整型)

TINYINT :
  默认是否有符号 :默认是带有符号的
  超出限制会如何 :超出之后只会存最大值或者最小值

INT:

  默认是有符号的,超出后只会存最大值或者最小值

要想让他没有符号呢 可以用sql语句限制它,语句为:unsigned 作用就是无正负符号

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

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

int[填入的数字]  就是你填入的数字是几位存几位或者超出你填入的数字也会全部存完,不够八位默

认空格填充

使用sql语句修改约束条件  不够位数的情况下用0填充,语句为:zerofill  但是有限制最大是429496725,但是超了也没关系

对于整型来说:

  数据类型后的宽度并不是存储限制,而是显示限制,所以在创建表时,

如果字段采用的是整型类型,完全无需指定显示宽度, 默认的显示宽度,足够显示完整当初存放的数据,

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

区别:

  

严格模式:

  在我们插入多余数据的时候,数据库会自动帮我们截掉。  但是我们应该遵循尽量让数据库少干活的原则,针对这种情况,

数据库应该报错,但是它没报错,因为5.6版本没有遵循严格模式,如果是5.7或者5.7以上都是严格模式。我们可以使用sql语句设置严格模式。

  模糊匹配:

    like      关键字

      %匹配任意多个字符

      _匹配任意一个字符

  查看严格模式:

    show variables %mode%   (百分号内放要匹配的字符)

 

  设置严格模式语句:

    set session    临时有效:只在当前操作的窗口有效,一旦你退出登陆了再登进来就没用了

    set global      全局有效  终身有效

      set global sql_mode = 'STRICT_TRANS_TABLES'

      设置完之后重新进入客户端即可

这样设置完成之后就能减轻MySQL的压力了,超出的数据直接就给报错。

 

浮点型:

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

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

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

验证他们三个不一样的时候可以创三张表并插入相同的数据来对比一下来对比一下:

  创建表:

给三张表中插入相同的数据并查看:

对比发现,他们三个小数位都是一样的,但是精确度不一样:FLOAT < DOUBLE < DECIMAL

 

字符类型:

  char(定长)  只能存固定字符,超出了会直接报错。如果少了会自动用空格填充

  varchar (变成) 只能存固定字符,超出了会直接报错。如果少了  有几个存几个

  mysql在存储char类型字段的时候,硬盘上确确实实存的是固定长度的数据,但是在取出来的

一瞬间,mysql会自动将填充的空格去除。看着给我们的感觉跟varchar是一样的,就是你存入几个

数据长度查看的就是几个数据长度,但是它内部有一个处理机制,会自动去除空格。

查看插入的字符长度sql语句为:

  select char_length(你要查的字段名,比如name) from 表名;

通过严格模式来修改不自动去除空格的机制:

  set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";

  然后先quit退出,再进来查看有没有修改成功,图片右下角显示已经修改成功。

  写修改严格模式的时候,两个一定要都写,因为这是一个替换的过程,不是新增一个模式。

char 与 varchar的区别

  char 定长   

    存浪费空间

    存取速度快

    取的时候方便,直接按固定长度取值即可,

  varchar 变长 

    存节省空间

    存取速度慢:存的时候需要给数据加一个记录长度的报头,

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

    取的时候比较繁琐,因为无法知道数据有多长。

 

日期类型:

  date  年月日

  datetime 年月日时分秒  

  year  存年份

  time  时分秒

创建表,插入数据并查看表:

 

枚举与集合类型:

  枚举:

    关键字 :enum

    多选一(限制某个字段能够存储的数据内容)

  集合:多选多或者多选一

  

约束条件:

  not null  不能为空

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

  sql语句:create table t17(id int,name char(16) default '插入的数据');

  往表中插入数据的时候 可以指定字段进行插入 不需要全部都插
  insert into t17(name,id) values('jack',2);

单例唯一:限制某一个字段是唯一的  sql语句为:unique

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

 

primary key 主键
  限制效果跟 not null + unique 组合效果一致 非空且唯一
  create table 表名(id int primary key);

  primary key也是innodb引擎查询必备的索引,索引你就把当成书的目录。

  innodb引擎在创建表的时候 必须要有一个主键,当你没有指定主键的时候:
  1.会将非空切唯一的字段自动升级成主键
  2.当你的表中没有任何的约束条件 innodb会采用自己的内部默认的一个主键字段
  该主键字段你在查询时候是无法使用的,查询数据的速度就会很慢,类似于一页一页的翻书。

主键字段到底设置给谁呢?

  通常每张表里面都应该有一个id字段,并且应该将id设置为表的主键字段

  通常每张表里面都应该有能标识数据编号的这么一个字段,默认情况下都是将标识数据编号的这么一个字段设置为主键。

联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键!
  innodb引擎中一张表有且只有一个主键

  主键字段应该具备自动递增的特点
  每次添加数据 不需要用户手动输入
  auto_increment 自动递增
delete from 仅仅是删除数据 不会重置主键
truncate 初始化表 会重置主键

 

posted @ 2019-08-20 17:21  稳我  阅读(2213)  评论(0编辑  收藏  举报