mysql⾼级分组函数,炸裂!82张图进阶MySQL的⾼级玩法!-
MySQL-dbaplu。。。
SQL Mode 可以解决下⾯这⼏种问题
通过设置 SQL Mode,可以完成不同严格程度的数据校验,有效保障数据的准确性。
设置 SQL Mode 为ANSI模式,来保证⼤多数 SQL 符合标准的 SQL 语法,这样应⽤在不同数据库的迁移中,不需要对 SQL 进⾏较⼤的改变
数据在不同数据库的迁移中,通过改变 SQL Mode 能够更⽅便的进⾏迁移。
下⾯我们就通过⽰例来演⽰⼀下 SQL Mode ⽤法
我们可以通过
select @@sql_mode;
来查看默认的 SQL Mode,如下是我的数据库所⽀持的 SQL Mode
涉及到很多 SQL Mode,下⾯是这些 SQL Mode 的解释
ONLY_FULL_GROUP_BY:这个模式会对 GROUP BY 进⾏合法性检查,对于 GROUP BY 操作,如果在SELECT 中的列,没有在GROUP BY 中出现,那么将认为这个 SQL 是不合法的,因为列不在 GROUP BY 从句中
同样举个例⼦,我们现在查询⼀下 cxuan005 的 id 和 info 字段。
select id,info from cxuan005;
这样是可以运⾏的
然后我们使⽤ GROUP BY 字句进⾏分组,这⾥只对 info 进⾏分组,我们看⼀下会出现什么情况
select id,info from cxuan005 group by info;
我们可以从错误原因中看到,这条 SQL 语句是不符合 ONLY_FULL_GROUP_BY 的这条 SQL Mode 的。因为我们只对 info 进⾏分组了,没有对 id 进⾏分组,我们把 SQL 语句改成如下形式
select id,info from cxuan005 group by id,info;
这样 SQL 就能正确执⾏了。
当然,我们也可以删除 sql_mode = ONLY_FULL_GROUP_BY 的这条 Mode,可以使⽤
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
来进⾏删除,删除后我们使⽤分组语句就可以放飞⾃我了。
select id,info from cxuan005 group by info;
但是这种做法只是暂时的修改,我们可以修改配置⽂件 my.ini 中的 sql_mode=
STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENG
STRICT_TRANS_TABLES:这就是严格模式,在这个模式下会对数据进⾏严格的校验,错误数据不能插⼊,报error 错误。如果不能将给
定的值插⼊到事务表中,则放弃该语句。对于⾮事务表,如果值出现在单⾏语句或多⾏语句的第1⾏,则放弃该语句。
当使⽤ innodb 存储引擎表时,考虑使⽤ innodb_strict_mode 模式的 sql_mode,它能增量额外的错误检测功能。
NO_ZERO_IN_DATE:这个模式影响着⽇期中的⽉份和天数是否可以为 0(注意年份是⾮ 0 的),这个模式也取决于严格模式是否被启⽤。
mysql高级教程视频如果这个模式未启⽤,那么⽇期中的零部分被允许并且插⼊没有警告。如果这个模式启⽤,那么⽇期中的零部分插⼊被作为 0000-00-00
并且产⽣⼀个警告。
这个模式需要注意下,如果启⽤的话,需要 STRICT_TRANS_TABLES 和 NO_ZERO_IN_DATE 同时启⽤,否则不起作⽤,也就是
set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE';
然后我们换表了,使⽤ cxuan003 这张表,表结构如下
我们主要测试⽇期的使⽤,在 cxuan003 中插⼊⼀条⽇期为 0000-00-00 的数据
insert into cxuan003 values(111,'study','0000-00-00');
发现能够执⾏成功,但是把年⽉⽇各⾃变为 0 之后再进⾏插⼊,则会插⼊失败。
insert into cxuan003 values(111,'study','2021-00-00');
insert into cxuan003 values(111,'study','2021-01-00');
这些组合有很多,我这⾥就不再细致演⽰了,读者可以⾃⾏测试。
如果要插⼊ 0000-00-00 这样的数据,必须设置 NO_ZERO_IN_DATE 和NO_ZERO_DATE。
ERROR_FOR_DIVISION_BY_ZERO:如果这个模式未启⽤,那么零除操作将会插⼊空值并且不会产⽣警告;如果这个模式启⽤,零除操作插⼊空值并产⽣警告;如果这个模式和严格模式都启⽤,零除从操作将会产⽣⼀个错误。
NO_AUTO_CREATE_USER:禁⽌使⽤ grant 语句⾃动创建⽤户,除⾮认证信息被指定。
NO_ENGINE_SUBSTITUTION:此模式指定当执⾏ create 语句或者 alter 语句指定的存储引擎没有启⽤或者没有编译时,控制默认存储引擎的⾃动切换。默认是启⽤状态的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论