2、MySQL基础数据类型、完整性约束、sql_mode模式

1. MySQL常用数据类型

  • MySQL常用数据类型预览

    1.数字:

    整型:
    tinyinit int bigint 小数:
    float:在位数比较短的情况下不精准
    double:在位数比较长的情况下不精准
    decimal:精准、内部原理是以字符串形式去存,如果用小数,则用推荐使用decimal

    2.字符串:

    char(10):
    简单粗暴,浪费空间,存取速度快 varchar(10):
    精准,节省空间,存取速度慢

    3.时间类型:

    最常用:datetime

    4.枚举类型与集合类型

1. 1 数值类型

  • 整数类型

    1.整数类型:tinyint、smallint、mediumint、int、bigint

    2.插入超出范围的数字会储存为能达到的最大数字,(默认为宽松模式)

    3.作用:存储年龄,等级,id,各种号码等

    1.tinyint[(m)] [unsigned] [zerofill]
    -- 小整数,数据类型用于保存一些范围的整数数值范围:
    -- 有符号范围:-128 ~ 127
    -- 无符号范围:0 ~ 255 2.int[(m)][unsigned][zerofill]
    -- 整数,数据类型用于保存一些范围的整数数值范围:
    -- 有符号:-2147483648 ~ 2147483647
    -- 无符号:0 ~ 4294967295 3.bigint[(m)][unsigned][zerofill]
    -- 大整数,数据类型用于保存一些范围的整数数值范围:
    -- 有符号:-9223372036854775808 ~ 9223372036854775807
    -- 无符号:0 ~ 18446744073709551615

    sql语句示例:

    -- 创建有符号数值类型示例:
    mysql> create table t1(money tinyint); -- 创建无符号数值类型示例:unsigned/约束无符号
    mysql> create table t2(id tinyint unsigned); -- 设置了数据类型,会有一个约束效果,只能表示自己范围内的数
  • 浮点型

    1.浮点型分类:float、double、decimal

    2.作用:存储薪资、身高、温度、体重、体质参数等

    1.FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
    -- 单精度浮点数(非准确小数值),M是整数部分+小数部分的总个数,D是小数点后个数。
    -- M最大值为255,D最大值为30,例如:float(255,30)/小数点不占位
    -- 有符号:-3.402823466E+38 ~ -1.175494351E-38,
    -- 1.175494351E-38 ~ 3.402823466E+38
    -- 无符号:1.175494351E-38 ~ 3.402823466E+38
    -- 精确度:**** 随着小数的增多,精度变得不准确 **** 2.DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
    -- 双精度浮点数(非准确小数值),M是整数部分+小数部分的总个数,D是小数点后个数。
    -- M最大值也为255,D最大值也为30
    -- 有符号:-1.7976931348623157E+308 ~ -2.2250738585072014E-308
    -- 2.2250738585072014E-308 ~ 1.7976931348623157E+308
    -- 无符号: 2.2250738585072014E-308 ~ 1.7976931348623157E+308
    -- 精确度:****随着小数的增多,精度比float要高,但也会变得不准确 **** 3.decimal[(M,D)] [unsigned] [zerofill]
    -- 准确的小数值,M是整数部分+小数部分的总个数(负号不算),D是小数点后个数。
    -- M最大值为65,D最大值为30。比float和double的整数个数少,但是小数位数都是30位
    -- 精确度: **** 随着小数的增多,精度始终准确 ****
    -- decimal能够存储精确值的原因在于其内部按照字符串存储,对于精确数值计算时需要用此类型 -- 总结:
    -- 精度从高到低:decimal、double、float
    -- decimal精度高,但是整数位数少
    -- float和double精度低,但是整数位数多

    sql语句示例:

    -- float示例:
    mysql> create table t3(price float(60,30));
    -- double示例:
    mysql> create table t4(price double(60,30));
    -- decimal示例:
    mysql> create table t5(price decimal(60,30));

1.2 日期类型

  • 日期类型定义:

    1.类型:DATE,TIME,DATETIME ,IMESTAMP,YEAR

    2.作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等

    1.YEAR:YYYY(范围:1901/2155)2018
    2.DATE:YYYY-MM-DD(范围:1000-01-01/9999-12-31)例:2018-01-01
    3.TIME:HH:MM:SS(范围:'-838:59:59'/'838:59:59')例:12:09:32
    4.DATETIME:YYYY-MM-DD HH:MM:SS(范围:1000-01-01 00:00:00/9999-12-31 23:59:59 Y)
    5.TIMESTAMP:YYYYMMDD HHMMSS(范围:1970-01-01 00:00:00/2037 年某时)/-- 由于日期马上到了,现在基本不怎么使用了
  • sql语句示例:

    -- year、date、datetime示例:
    mysql> create table t6(d1 year ,d2 date,d3 datetime);
    -- 插入当前时间示例:
    mysql> insert into t6 values(now(),now(),now());

1.3 字符串类型

  • 字符串类型定义:

    1.类型:char,varchar 内部存储的空间定长不定长

    2.作用:名字,信息等等

    3.注意:char和varchar括号内的参数指的都是字符的长度(5.6版本以前指的是字节,5.6版本以前指的是字符)

    1.char类型:定长,简单粗暴,浪费空间,存取速度快
    -- 字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节)
    -- 存储:存储char类型的值时,会往右填充空格来满足长度
    -- 例如:指定长度为10,存大于10个字符则报错(严格模式下),存小于10个字符则用空格填充直到凑够10个字符存储
    -- 检索:在检索或者查询时,查出的结果会自动删除尾部的空格,如果想看到它补全空格之后的内容,除非我们打开pad_char_to_full_length SQL模式(SET sql_mode = 'strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH';) 2.varchar类型:变长,精准,节省空间,存取速度慢
    -- 字符长度范围:0-65535(如果大于21845会提示用其他类型,mysql行最大限制为65535字节,字符编码为utf-8)
    -- 存储:varchar类型存储数据的真实内容,不会用空格填充,如果'ab ',尾部的空格也会被存起来
    -- 如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255)
    -- 如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535)
    -- 检索:尾部有空格会保存下来,在检索或者查询时,也会正常显示包含空格在内的内容 -- 总结:
    -- varchar在存数据的时候,会在每个数据前面加上一个头,这个头是1-2个bytes的数据,这个数据指的是后面跟着的这个数据的长度,1bytes能表示2**8=256,两个bytes表示2**16=65536,能表示0-65535的数字,所以存的时候会比较麻烦,导致效率比char慢,取的时候也慢,先拿长度,再取数据。
    -- 优点:节省了一些硬盘空间,一个acsii码的字符用一个bytes长度就能表示,但是也并不一定比char省,看一下官网给出的一个表格对比数据,当存的数据正好是规定的字段长度的时候,varchar反而占用的空间比char要多

    char和varchar对比示例图:

1.5 枚举和集合类型

  • 枚举和集合类型定义:

    1.enum中文名称叫枚举类型,它的值范围需要在创建表时通过枚举方式显示。enum只允许从值集合中选取单个值,而不能一次取多个值。如性别 sex: 男:male/女:female

    2.set类型可以允许值集合中任意选择1或多个元素进行组合,里面可以包含0-64个成员,对超出范围的内容将不允许注入,而对重复的值将进行自动去重

  • sql语句示例:

    mysql> create table consumer(
    -> name varchar(50),
    -> sex enum('male','female'),
    -> hobby set('play','music','read','study') -- 在指定范围内,多选多
    -> ); -- 错误示范:
    create table t5(sex char(16) enum('male','female') default 'male');
    -- 正确示范:
    create table t5(sex enum('male','female') default 'male');
    -- 注意:枚举前面的字段不需要加属性

2. 完整性约束

  • not null 不为空

    create table t1(name char(10) not null);
  • default 默认值

    create table t1(name char(10) not null default 'zhangsan');
    
    -- 设置id字段有默认值后,则无论id字段是null还是not null,都可以插入空,插入空默认填入default指定的默认值
  • unique 唯一/字段数据不能重复

    create table t1(name char(10) unique);
    
    --设置联合唯一约束示例:
    create table service(
    id int primary key auto_increment,
    name varchar(20),
    host varchar(15) not null,
    port int not null,
    unique(host,port) -- 联合唯一
    );
  • primary key 主键

    -- 建表时指定主键:
    create table t1(id int primary key);
    -- 建表后指定主键:
    constraint pk_name primary key(id); -- 创建主键并为其命名pk_name -- 约束效果:不为空且唯一 not null + unique
  • 联合主键

    mysql> create table t1(
    ->id int,
    ->port int,
    ->primary key(id,port)
    -> ); -- 和联合唯一是类似的, 看key,两个都写的是pri,两个联合起来作为主键,他们两个作为一个主键,不能再有其他的主键了,也就是在创建表的时候,只能出现一次primary key方法。
  • auto_increment 自增

    create table t1(id int primary key auto_increment);
    -- 前面必须是primary key -- 在创建完表后,修改自增字段的起始值
    alter table student auto_increment=3; -- 创建表时指定自增字段的初始值,注意初始值的设置为表选项,应该放到括号外
    create table student(
    id int primary key auto_increment,
    name varchar(20),
    sex enum('male','female') default 'male'
    )auto_increment=3; -- 自增的步长相关:
    -- 基于表级别
    SET @@auto_increment_increment=10; -- 查看当前会话自增的步长:
    show session variables like 'auto_inc%'; -- 基于会话级别/修改会话级别的步长
    set session auto_increment_increment=2 -- 基于全局级别的/修改全局级别的步长(所有会话都生效)
    set global auto_increment_increment=2
  • foreign key 外键 建立表关系使用的约束条件

    多对一 / 一对多

    foreign key  -- 外键其实就是标明表和表之间的关系
    -- 一对多或为多对一
    -- 两张张表:出版社,书 -- 一个出版社可以出版多本书 create table press(
    id int primary key auto_increment,
    name varchar(20)
    ); create table book(
    id int primary key auto_increment,
    name varchar(20),
    press_id int not null,
    foreign key(press_id) references press(id)
    on delete cascade
    on update cascade
    );

    总结:

    1、先要建立被关联的表才能建立关联表
    2、在插入数据记录的时候,要先在被关联表中插入数据,才能往关联表里面插入数据
    3、更新或者删除数据的时候,都需要考虑关联表和被关联表的关系
    解决方案:
    a.删除表的时候,先删除关联表,再删除被关联表
    b.重建表的时候,在加外键关联的时候加上这两句:on delete cascade 和 on update cascade

    一对一

    -- 两张表:学生表和客户表
    -- 一个学生是一个客户 create table customer(
    -> id int primary key auto_increment,
    -> name varchar(20) not null,
    -> qq varchar(10) not null,
    -> phone char(16) not null
    -> ); create table student(
    -> id int primary key auto_increment,
    -> class_name varchar(20) not null,
    -> customer_id int unique, -- 该字段一定要是唯一的
    -> foreign key(customer_id) references customer(id) -- 外键的字段一定要保证unique
    -> on delete cascade
    -> on update cascade
    -> );

    多对多

    -- 两张表:作者信息,书
    -- 一个作者可以写多本书,一本书也可以有多个作者,双向的一对多,即多对多
    -- 关联方式:foreign key+一张新的表 create table author(
    id int primary key auto_increment,
    name varchar(20)
    ); -- 这张表就存放作者表与书表的关系,即查询二者的关系查这表就可以了
    create table author2book(
    id int not null unique auto_increment,
    author_id int not null,
    book_id int not null,
    constraint fk_author foreign key(author_id) references author(id)
    on delete cascade
    on update cascade,
    constraint fk_book foreign key(book_id) references book(id)
    on delete cascade
    on update cascade,
    primary key(author_id,book_id)
    );

    外键相关操作:

    -- 1.查看外键关系名称
    show create table book; -- 2.删除外键关系
    alter table book drop foreign key book_ibfk_1(外键名称) -- 3.创建表完成之后,添加外键
    alter table book add foreign key(pid) references publish(id); -- 4.创建外键时指定外键名称
    1.create table t1(
    id int,
    pid int,
    constraint fk_name foreign key(pid) references publish(id)
    );
    2.创建表完成之后,后添加外键关系
    alter table book add constraint fk_name foreign key(pid) references
    3.创建外键时指定外键名称(创建后不能修改外键名称,只能删除后再添加) -- 5.查看所有外键的信息
    select REFERENCED_TABLE_SCHEMA,REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME,table_name,CONSTRAINT_NAME from information_schema.key_column_usage;

    外键约束之级联

    级联的三种模式:级联中有一种模式是级联模式
    外键约束的三种约束方式: -- 模式一:
    district:严格约束(默认的):父表不能删除或者更新已经被子表数据引用的记录 -- 模式二:
    cascade:级联模式:父表的操作,对应的子表关联的数据也跟着操作 。
    constraint fk_t1_publish foreign key(pid) references publish(id) on delete cascade on update cascade; -- 模式三:
    set null:置空模式:父表操作之后,子表对应的数据(外键字段)也跟着被置空,被关联字段删除时,关联它的数据会置成null 1.通常的一个合理的约束模式是:删除的时候子表置空;更新的时候子表级联。
    2.指定模式的语法:foreign key(外键字段)references 父表(主键字段)on delete 模式 on update 模式;
    3.外键虽然很强大,能够进行各种约束,但是外键的约束降低了数据的可控性和可拓展性。通常在实际开发时,很少使用外键来约束。

3. MySQL的sql_mode模式说明以及设置

  • sql_mode简述:

    sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,在生产环境必须将这个值设置为严格模式,所以开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题.

  • MySQL的sql_mode的四种模式

    ANSI模式/宽松模式

    对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告

    STRICT_TRANS_TABLES模式/严格模式

    进行数据的严格校验,错误数据不能插入,报error错误。只对支持事务的表有效。

    STRICT_ALL_TABLES模式/严格模式

    进行数据的严格校验,错误数据不能插入,报error错误。对所有表都有效。

    TRADITIONAL模式/严格模式

    当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误。用于事务时,会进行事务的回滚。
  • 严格模式设置和修改

    方式一:当前会话配置

    -- 查看当前会话sql_mode模式
    select @@sql_mode -- 设置当前会话sql_mode模式
    set sql_mode = '修改后的值';
    set session sql_mode='修改后的值';
    例如:set session sql_mode='STRICT_TRANS_TABLES'; -- 改为严格模式,session可以不用写
    -- 此方法只在当前会话中生效,关闭当前会话就不生效了。

    方式二:全局配置/当前服务

    -- 查看全局sql_mode模式
    select @@global.sql_mode
    -- 设置全局sql_mode模式
    set global sql_mode = '修改后的值'。 -- 此方法在当前服务中生效,重新MySQL服务后失效

    方法三:全局配置/永久

    sql_mode = STRICT_TRANS_TABLES
    -- 在mysql配置文件my.cnf文件(windows系统是my.ini文件),添加sql_mode -- 示例如下:
    [mysqld] sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES -- ONLY_FULL_GROUP_BY:限制必须是分组依据,或统计结果
    -- STRICT_TRANS_TABLES:严格模式

数据库02 /MySQL基础数据类型、完整性约束、sql_mode模式的更多相关文章

  1. Mysql基础(三):MySQL基础数据类型、完整性约束、sql_mode模式

    目录 2.MySQL基础数据类型.完整性约束.sql_mode模式 1. MySQL常用数据类型 2. 完整性约束 3. MySQL的sql_mode模式说明以及设置 2.MySQL基础数据类型.完整 ...

  2. { MySQL基础数据类型}一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型

    MySQL基础数据类型 阅读目录 一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型 一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己 ...

  3. 数据库及MYSQL基础(2)

    数据库及MySQL基础(1) SQL进阶及查询练习 1,单表的查询练习 SELECT * FROM emp WHERE deptno=30; SELECT ename,empno,deptno FRO ...

  4. MySQL基础数据类型

    一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考: http://www.runoob.com/mysql/mysql-data ...

  5. 02 . Mysql基础操作及增删改查

    SQL简介 SQL(Structured Query Language 即结构化查询语言) SQL语言主要用于存取数据.查询数据.更新数据和管理关系数据库系统,SQL语言由IBM开发. SQL语句四大 ...

  6. MySQL数据库3 - MySQL常用数据类型

    一. MySql常用数据类型 数据类型:整数(tinyint smailint int bigint) 定点数 decimal(p,s) ------ 小数点位置固定的       ---> 数 ...

  7. 02 mysql 基础二 (进阶)

    mysql 基础二 阶段一 表约束 1.not null 非空约束 例子: create table tb1( id int, name varchar(20) not null ); 注意 空字符不 ...

  8. python day10 数据库(mysql基础)

    一.数据库的概念 数据:事物的特征 数据库的本质是:通过套接字进行通信,来读存数据的一种软件,由于每次开发人员写程序都得写数据的套接字,所以诞生了数据库这个软件,减少重复劳动.(sql语句通用) 数据 ...

  9. 关系型数据库之MySQL基础总结_part1

    一:数据库的操作语言的种类 MySQL 是我们最常使用的关系型数据库,对于MySQL的操作的语言种类又可以分为:DDL,DML,DCL,DQL DDL:是数据库的定义语言:主要对于数据库信息的一些定义 ...

随机推荐

  1. 利用 Powershell 编写简单的浏览器脚本

    生活中有很多事情是低效益,重复性.比如每天上某些网站,先登录再签到打卡,比如每隔一段时间清理回收站的文件等等.一个成熟的软件工程师应该想到用软件解决他. 对于这些简单的小任务,一般用脚本实现.比如Py ...

  2. ios swift 知识点记录

      1. 定义变量 var name = "***" 定义常量 let name ="*****" 2. swift 变量类型  String, Int, Fl ...

  3. Hexo快速构建个人小站-自定义域名和自定义主题(二)

    背景交代: 在上一章<Hexo快速构建个人小站-Hexo初始化和将项目托管在Github(一)>中,我们已经成功的利用hexo初始化了博客项目,并托管在Github上,且通过Github的 ...

  4. 在群晖NAS上运行URLOS之后竟然能安装Discuz! Q!!

    如果我们手头上有1台群晖NAS时,有没有考虑过把群晖NAS当成服务器来使用,这样会不会很有意思呢? 现在,我们终于可以尝试一番了,把群晖NAS变成一台实实在在的服务器,在上面跑各种运行环境!其实很简单 ...

  5. C++ 公有继承、保护继承和私有继承的对比

    在c++的继承控制中,有三种不同的控制权限,分别是public.protected和private.定义派生类时,若不显示加上这三个关键字,就会使用默认的方式,用struct定义的类是默认public ...

  6. 有趣的条漫版 HashMap,25岁大爷都能看懂

    我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...

  7. 爬取B站弹幕并且制作词云

    目录 爬取弹幕 1. 从手机端口进入网页爬取找到接口 2.代码 制作词云 1.文件读取 2.代码 爬取弹幕 1. 从手机端口进入网页爬取找到接口 2.代码 import requests from l ...

  8. 使用 Masstransit中的 Request/Response 与 Courier 功能实现最终一致性

    简介 目前的.net 生态中,最终一致性组件的选择一直是一个问题.本地事务表(cap)需要在每个服务的数据库中插入消息表,而且做不了此类事务 比如:创建订单需要 余额满足+库存满足,库存和余额处于两个 ...

  9. 不就是语法和长难句吗—笔记总结Day2

    6.区别定语从句和同位语从句 I have a dream that sounds funny. (定语从句) I have a dream that I will become a rich man ...

  10. 病毒Virus

    病毒Virus 一本通P1396 病毒Virus 题目简述 给定\(k\)个被病毒感染了的字符串,知道这\(k\)个字符串原本是按字典序从小到大排列,最后给出一个待复原的字符串\(s\),要求根据上面 ...