· 错误:1172 SQLSTATE: 42000 (ER_TOO_MANY_ROWS) 消息:结果有1个以上的行组成。...· 错误:1444 SQLSTATE: HY000 (ER_PS_NO_RECURSION) 消息:预处理语句包含引用了相同语句的存储子程序调用。不允许以这类递归方式执行预处理语句。...由于更新很频繁,这些文件中可能包含这里未列出的额外错误消息。 · 错误:2000 (CR_UNKNOWN_ERROR) 消息:未知MySQL错误。...· 错误:2003 (CR_CONN_HOST_ERROR) 消息:不能连接到'%s' (%d)上的MySQL服务器。...· 错误:2013 (CR_SERVER_LOST) 消息:查询过程中丢失了与MySQL服务器的连接。
上的不论什么一台电脑上登录你的mysql数据库并对你的数据库test为所欲为了(能够通过限定主机) mysql>grant select,insert,update,delete on test.*...; 显示MySQL数据库的版本号: mysql>select version(); 显示函数 mysql>Select * from mysql.func; 显示存储过程 mysql..., or BDB 的表格上,能够在有null值的字段上创建索引 存储引擎为 MyISAM, InnoDB, or BDB 的表格上,能够在BLOB TEXT 上创建索引 仅仅有在MyISAM 类型表格上...GROUP BY部分中,而HAVING用来决定应该仅仅用结果集合中的哪些行。...1171 42000 ER_TOO_MANY_ROWS 1172 42000 ER_REQUIRES_PRIMARY_KEY 1173 42000 ER_NO_RAID_COMPILED
) 消息:%s()的结果大于max_allowed_packet (%ld),已截短 错误:1302 SQLSTATE: HY000 (ER_CONFLICTING_DECLARATIONS) 消息:...错误:1384 SQLSTATE: HY000 (ER_DIFF_GROUPS_PROC) 消息:尚不能用不同的组处理过程。...[Page] 错误:1403 SQLSTATE: 42000 (ER_NONEXISTING_PROC_GRANT) 消息:在子程序’%s’上没有为主机’%s’上的用户’%s’定义的这类授权。...错误:1415 SQLSTATE: 0A000 (ER_SP_NO_RETSET) 消息:不允许从%s返回结果集。...错误:1444 SQLSTATE: HY000 (ER_PS_NO_RECURSION) 消息:预处理语句包含引用了相同语句的存储子程序调用。不允许以这类递归方式执行预处理语句。
如果你使用非事务存储引擎,这种方式不是你想要的,因为出现错误前进行的数据更改不会“滚动”,结果是更新“只进行了一部分”。...但是需要注意的问题是,如果数据库运行在严格模式下,并且你的存储引擎不支持事务(现在基本上都是用的InnoDB引擎了,不支持事务的较少见),那么有数据不一致的风险存在,比如一组sql中有两个dml语句,如果后面的一个出现了问题...NO_ENGINE_SUBSTITUTION不使用默认引擎替代 设置这个参数后,如果需要的存储引擎被禁用或未编译,那么抛出错误。...当新插入的行不包含某列的没有显示定义DEFAULT子句的值,则该值被丢失。...如果语句插入或修改多行,并且坏值出现在第2或后面的行,结果取决于启用了哪个严格选项: 对于STRICT_ALL_TABLES,MySQL返回错误并忽视剩余的行。
在非严格模式,可以接受该日期,但会生成警告 ERROR_FOR_DIVISION_BY_ZERO: 在严格模式,在INSERT或UPDATE过程中,如果被零除(或MOD(X,0)),则产生错误(否则为警告...NO_ENGINE_SUBSTITUTION: 如果需要的存储引擎被禁用或未编译,那么抛出错误。...对于本文开头中提到的错误,可以先把sql_mode设置为ANSI模式,这样便可以插入数据,而对于除数为0的结果的字段值,数据库将会用NULL值代替。...如果你使用非事务存储引擎,这种方式不是你想要的,因为出现错误前进行的数据更改不会“滚动”,结果是更新“只进行了一部分”。...如果不能将给定的值插入到事务表中,则放弃该语句。对于非事务表,如果值出现在单行语句或多行语句的第1行,则放弃该语句。
,比如存储过程、触发器、视图等#存储引擎 层而存储引擎层负责数据的存储和提取。...现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎图片#连接器第一步,你会先连接到这个数据库上,这时候接待你的就是连接器。...它也要把字符串“T”识别成“表名 T”,把字符串“ID”识别成“列 ID”2.第二就要做“语法分析”判断你输入的这个 SQL 语句是否满足 MySQL 语法一般语法错误会提示第一个出现错误的位置,所以你要关注的是紧接...(在工程实现上,如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证。...3.执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
DETERMINISTIC 表示结果是确定的。每次执行存储过程时,相同的输入会得到 相同的输出。 [NOT] DETERMINISTIC 表示结果是不确定的,相同的输入可能得到不同的输出。...t3表是我们上一节创建的表 这里的逻辑是 1、先判断是否有Proc() 这个存储过程,有就drop掉 2、创建Proc() 存储过程 3、执行Proc() 存储过程 注意:“DELIMITER //”...和mysql_error_code都可以表示mysql错误 sqlstate_value为长度5的字符串错误代码 mysql_error_code为数值类型错误代码,例如:ERROR1142(42000...,实际上一样的 查询语句可能查询出多条记录,在存储过程和函数中使用光标来逐条读取查询结果集中的记录。...调用存储过程后,数据库系统将执行存储过程中的语句。 然后,将结果返回给输出值。
DETERMINISTIC 表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。[NOT] DETERMINISTIC 表示结果是不确定的,相同的输入可能得到不同的输出。...和MySQL_error_code都可以表示MySQL错误 sqlstate_value为长度5的字符串错误代码 MySQL_error_code为数值类型错误代码,例如:ERROR1142(42000...*/ CALL handlerdemo(); /* 查看调用存储过程结果*/ SELECT @X @X是一个用户变量,执行结果@X等于3,这表明MySQL执行到程序的末尾。...这里的变量跟SQLSERVER没有什么区别,都是用来存储临时值的 光标 MySQL里叫光标,SQLSERVER里叫游标,实际上一样的 查询语句可能查询出多条记录,在存储过程和函数中使用光标来逐条读取查询结果集中的记录...调用存储过程后,数据库系统将执行存储过程中的语句。 然后,将结果返回给输出值。
[Err] 1172 – Result consisted of more than one row 所以需要在存储过程的SQL后面加上LIMIT 1。...10.1.2 创建存储函数 存储函数与存储过程本质上是一样的,都是封装一系列SQL语句,简化调用。 我们自己编写的存储函数可以像MySQL函数那样自由的被调用。...@result的值为2的结果说明了存储过程执行到结尾。从表中的结果来看,也是正确的插入了两条数据。...总之,下面的核心知识点没有疑问:在声明条件后并遇到相关的错误条件后,那就看应该怎么处理。如果是EXIT,那么存储过程只生效到错误处的上一条SQL。...阅读更多 从头开始学MySQL——-存储过程与存储函数(1) 从头开始学MySQL——-存储过程与存储函数(2) 从头开始学MySQL——-存储过程与存储函数(3) 从头开始学MySQL——-
从逻辑上,我们可以将MySQL粗略地分成三层:Server层、存储引擎层和系统文件层,而Server层中又可以分成网络连接层(连接器)和数据服务层(Server层)。...Server层中包含了连接器、查询缓存、分析器、优化器和执行器等MySQL的核心组成部分,另外,在Server层中还包含了所有的内置函数(比如:日期时间函数、加解密函数、聚合函数、数学函数等),存储引擎...首先会进行打开数据表的操作,此时优化器会根据创建表时使用的存储引擎,使用相应存储引擎的接口执行查询操作。这里,我们举一个例子: 假设,我们在id字段上没有建立索引,执行器执行的流程大致如下所示。...(2)继续通过存储引擎读取下一行数据,执行与(1)相同的逻辑判断,直到处理完user表中的所有数据。 (3)处理完所有的数据后,执行器就会将结果集中的数据返回给客户端。...不过在有些场景下,执行器调用一次,存储引擎内部会会扫描多行,这就导致存储引擎扫描的行数与rows_examined字段标识的行数并不完全相同。
,却不知道这条语句在 MySQL 内部的执行过程。...Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程...查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率会非常低。...执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。 至此,这个语句就执行完成了。 对于有索引的表,执行的逻辑也差不多。...在有些场景下,执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟 rows_examined 并不是完全相同的。
MySQL 内部的执行过程。...Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程...查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率会非常低。...执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。 至此,这个语句就执行完成了。 对于有索引的表,执行的逻辑也差不多。...在有些场景下,执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟 rows_examined 并不是完全相同的。我们后面会专门有一篇文章来讲存储引擎的内部机制,里面会有详细的说明。
MySql 的大部分核心功能都在这一层完成的,像它的所有内置函数,比如时间函数和日期函数等,也就是说所有的跨存引擎的功能均是在 Server 这层去实现,比如,视图、触发器以及存储过程等。...接着 MySQL 就会做 “语法分析”,根据上述词法分析的结果,语法分析器会根据语法规则,判断我们输入的 SQL 语句是否满足 MySQL 语法。...执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。 这样,这条 SQL 语句就执行结束了。...不过,在有一些场景下,执行器执行一次,而在引擎内部却扫描了多行,所以,引擎扫描行数跟 rows_examined 并不是完全相同的,我们后面会在 MySQL 的存储引擎内部机制中进行讲解。...总结 今天,我们主要学习了 MySQL 的逻辑架构,知道了其主要有两大部分 Server 和存储引擎层组成,然后,我们通过对于一条 SQL 语句的分析知道了其在MySQL 中的所有执行过程,主要从连接器
如下图1给出的是 MySQL 的基本架构示意图,从中你可以清楚地看到 SQL 语句在 MySQL 的各个功能模块中的执行过程。 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。...Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程...查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率会非常低。...开始执行的时候,要先判断一下你对这个表 T 有没有执行查询的权限,如果没有,就会返回没有权限的错误。如下所示 (在工程实现上,如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证。...在有些场景下,执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟 rows_examined 并不是完全相同的。我们后面会专门有一篇文章来讲存储引擎的内部机制,里面会有详细的说明。
(1); ERROR 1305 (42000): FUNCTION rms.queryNameById does not exist mysql> 3、存储过程 存储功能和自定义函数相似,也是一组完成特定功能的...默认的结束命令字符为分号,当存储过程中包含多条语句时,遇到第一个分号会作为存储过程结束的标志。这样不符合预期,因此需要修改默认结束命令字符。 DELIMITER //就是将结束命令字符修改为//。...调用存储过程的命令为:call 存储过程名称。...| +--------------+ 1 row in set (0.03 sec) Query OK, 0 rows affected (0.04 sec) 修改存储过程 如果想创建存储过程的内容可以先删除再重新创建存储过程...c、自定义函数必须要包含return语句,而存储过程则不需要。
客户端 server层:(所有跨存储引擎的操作均在这一层完成,包含下面mysql核心功能及内置函数均在这一层完成) 连接器、查询缓存->分析器、优化器、执行器 存储层:(负责数据的存储和提取,其架构模式是插件式的...因为mysql在执行过程中临时使用的内存是管理在连接对象里面的,只有在连接断开后,内存再会被释放。...这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建的状态。 show processlist; 查询缓存 建立连接后,会优先查询缓存,若对应缓存存在,则直接返回结果。...查询缓存已key->value的形式存储在内存中,key为查询的sql,value为查询的结果。 若有对一个表进行更新,那么这个表的所有查询缓存均会失效。因此,查询缓存弊往往大于利,不建议使用。...执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。 这些接口都是引擎中已经定义好的。
本篇文章将通过一条 SQL 的执行过程来介绍 MySQL 的基础架构。...MySQL 基本架构 ? 大体上,MySQL 分为 Server 层和存储引擎层两部分。...Server 层包括连接器、查询缓存、分析器、执行器等,以及所有的内置函数(如日期、时间、数学和加密函数等)和跨存储引擎的功能(如存储过程、触发器、视图)。...存储引擎层负责数据的存储和提取,支持 InnoDB、MyISAM、Memory 等多个存储引擎。MySQL 5.5.5 版本后默认存储存储引擎是 InnoDB。...如果查询命中缓存,MySQL 不需要执行后面的复杂操作,就可以直接返回结果,会提升效率。 但是查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。
”组成的,在这个过程中逐步的揭开MySQL的面纱,对MySQL有个深入的理解。...从上图来看,MySQL大体上可以分为Server层和存储引擎层两部分。...Server层:包含连接器、查询缓存、分析器、优化器、执行器等,涵盖了MySQL的大部分核心服务功能,以及所有的内置函数,所有的跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等, 存储引擎层...其中最常用的存储引擎是InnoDB,从MySQL5.5.5版本开始就成为了默认的存储引擎。...在数据库的慢查询日志中可以看到一个rows_examined的字段,表示这个语句执行过程中扫描了多少行,这个值是在执行器每次调用引擎的时候累加的,有时候执行器调用一次,在引擎内部扫描了多行,隐藏引擎扫描行数跟
MySQL中的sql_mode参数 sql_mode参数详解 首先我们看看mysql中默认的sql_mode的值是什么: root@localhost :(none)09:25:15>select...,包含id和nam两列,sql_mode参数的存在不允许我们对个结果中的nam列进行group by,但是当我们select nam的时候,就可以进行group by操作。...在STRICT_TRANS_TABLES模式下,插入数据时,mysql会严格的进行数据的校验,当发现插入列值未满足要求,直接报告error错误,保证了错误数据无法插入到数据库中。...不设置此值时,用默认的存储引擎替代,并抛出一个异常。...如果未给出该模式,被零除时MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作结果为NULL。
领取专属 10元无门槛券
手把手带您无忧上云