mysql 开发基础系列22 SQL Model

一.概述

  与其它数据库不同,mysql 可以运行不同的sql model 下, sql model 定义了mysql应用支持的sql语法,数据校验等,这样更容易在不同的环境中使用mysql。
  sql model 常用来解决下面几类问题

  (1) 通过设置sql mode, 可以完成不同严格程度的数据校验,有效地保障数据准备性。
  (2) 通过设置sql model 为ansi 模式,来保证大多数sql符合标准的sql语法,这样应用在不同数据库之间进行迁移时,则不需要对业务sql 进行较大的修改。
  (3) 在不同数据库之间进行数据迁移之前,通过设置SQL Mode 可以使MySQL 上的数据更方便地迁移到目标数据库中。

  1. 演示sql model 严格模式

  从mysql 5.7 开始,  默认是严格模式, mysql 开始严格遵从SQL 92规范。通过strict_trans_tables严格模式实现了数据的严格校验。 使错误数据不能插入表中, 从而保证了数据的准确性。

-- 查看sql model 模式
  SELECT @@sql_mode;

  

--  下面可将sql model设置为严格模式
set session sql_mode=‘STRICT_TRANS_TABLES‘;
--  新建表设置address为10个长度
CREATE TABLE test_sqlmode
(
   address VARCHAR(10)
)
-- 插入超过长度
INSERT INTO test_sqlmode VALUES(‘123456789123‘);

  通过下图可以看出, 严格模式下超出数据 插入将报错。 如果不是严格模式,则会报warning 警告 并截取字符。

  

  2. sql mode 组合模式

    组合模式类似于角色和权限的关系。这样当实际应用时,只需要设置一个模式组合,就可以设置很多的原子模式,大大方便了用户的工作。


ANSI模式


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

等同于REAL_AS_FLOAT、PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE 和ANSI

组合模式


traditional 模式


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

TRADITIONAL 模式等同于STRICT_TRANS_TABLES、STRICT_ALL_TABLES、

NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、TRADITIONAL

和NO_AUTO_CREATE_USER 组合模式


STRICT_TRANS_TABLES模式


严格模式,进行数据的严格校验,错误数据不能插入,报error错误。

例如:不允许非法日期,也不允许超过字段长度的值插入字段中,对于插入不正确的值给出错误而不是警告

二. sql model 迁移如何使用

    如果mysql 与其它异构数据库之间有数据迁移的需求时,那么mysql中提供的数据库组合模式则会对数据迁移过程会有所帮助。对导出数据更容易导入目标。

  在数据迁移过程中,可以设置SQL Mode 为NO_TABLE_OPTIONS 模式,这样将去掉show create table 中的“engine”关键字,获得通用的建表脚本。

-- 查看表有 engine 引擎
SHOW CREATE TABLE test_sqlmode;

-- 将所有表去掉engine 引擎。变为通用表
-- 修改 当前会话下的sql model
SET SESSION sql_mode=‘NO_TABLE_OPTIONS‘

原文地址:https://www.cnblogs.com/MrHSR/p/9317979.html

时间: 2024-08-01 22:51:17

mysql 开发基础系列22 SQL Model的相关文章

mysql 开发基础系列6 数值与日期函数

一. 数值函数 1.  abs(x) 返回x的绝对值 SELECT ABS(-0.8),ABS(0.8); 2.ceil(x) 返回大于x的最大整数 SELECT CEIL(-0.8),CEIL(0.8); 3.floor(x) 返回小于x的最大整数 SELECT FLOOR(-0.8),FLOOR(0.8); 4.mod(x,y) 返回x/y的模 SELECT MOD(15,10),MOD(1,11),MOD(NULL,10) 5. rand() 返回0到1内的随机值 SELECT RAND(

mysql 开发基础系列7 流程函数与其它函数

一.流程函数 -- 创建表来介绍 CREATE TABLE salary (userid INT,salary DECIMAL(9,2)); INSERT INTO salary VALUES(1,1000),(2,2000), (3,3000),(4,4000),(5,5000), (1,NULL); SELECT * FROM salary 1. if(value,t,f)  超过2000的用high,否则用low SELECT IF(salary>2000 ,'high','low') F

夯实Java基础系列22:一文读懂Java序列化和反序列化

本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客: www.how2playlife.com 本文参考 http://www.importnew.com/17964.html和 https://www.ibm.com/developerworks/cn/java/j-lo-serial/ 序列化与反序列化概念 序列化 (S

实战基础技能(22)--------SQL 2008 如何配置远程连接

初次接触sql2008 相比05 改观还是挺大的 在配置方面 如何打开"远程连接" 成了最棘手的   到网上找了大半天资料    依然云里雾里 参考网上的众多资料 结合本人的实际经验 整理了以下步骤 sql server 2008默认是不允许远程连接的,sa帐户默认禁用的,如果想要在本地用SSMS连接远程服务器上的SQL Server 2008,需要做两个部分的配置: 1,SQL Server Management Studio Express(简写SSMS) 2,SQL Server

高性能服务器开发基础系列 (一)主线程与工作线程的分工

服务器端为了能流畅处理多个客户端链接,一般在某个线程A里面accept新的客户端连接并生成新连接的socket fd,然后将这些新连接的socketfd给另外开的数个工作线程B1.B2.B3.B4,这些工作线程处理这些新连接上的网络IO事件(即收发数据),同时,还处理系统中的另外一些事务.这里我们将线程A称为主线程,B1.B2.B3.B4等称为工作线程.工作线程的代码框架一般如下: while (!m_bQuit) { epoll_or_select_func(); handle_io_even

转:Hadoop大数据开发基础系列:七、Hive基础

https://blog.csdn.net/hehe_soft_engineer/article/details/102820968 原文地址:https://www.cnblogs.com/ambdyx/p/11779609.html

Windows驱动开发基础(八)内存管理

Windows驱动开发基础系列,转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/38826159 就32位的计算机来说,他有4G的真实的物理内存.但是这样是不够的,于是引入了虚拟内存的概念.使得每一个进程都有4G的虚拟内存. 虚拟内存实际上就是采用了一种映射的方式.4G的内存实际上被分页.一般来说一个页的大小是4K.也是说它被分为了1M个页.在这么多的页里面,有一部分是对应于物理内存的(可以是多对一的):有一部分是对应于磁盘上的空间,但

Windows 驱动开发基础(九)内核函数

Windows 驱动开发基础系列,转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/38849861 这里主要介绍3类Windows的内核函数:字符串处理函数,文件操作函数, 注册表读写函数.(这些函数都是运行时函数,所以都有Rtl字样) 1 字符串处理函数 首先驱动程序中,常用的字符串包括4种:CHAR (打印的时候注意小写%s), WCHAR(打印的时候注意大写%S), ANSI_STRING, UNICODE_STRING.后面两种

Windows 驱动开发基础(六)NT驱动的基本结构

Windows 驱动开发基础系列,转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/38821919 NT类型的驱动即不是即插即用的驱动,主要包括3部分:DriverEntry函数,CreateDevice函数,DriverUnload函数.其实还有IRP派遣函数,但是这里先不做介绍. 接下来详细的说明一下. 系统启动的时候,就创建了系统进程:驱动加载的时候,系统启动一个新的线程,创建一个驱动对象.而当系统线程调用DriverEntry函