3.说一说脏读、不可重复读、幻读 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据; 不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交...19.什么是触发器?触发器的作用? 触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。...触发器是在一个修改了指定表中的数据时执行的存储过程。通常通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性和一致性。...游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。 28.mysql有没有rowid?...;在不损失精确性的情况下,长度越短越好;ref:显示索引的哪一列被使用了,如果可能的话,是一个常数;rows:MySQL认为必须检查的用来返回请求数据的行数;Extra:关于MySQL如何解析查询的额外信息
,而NOT NULL则表示在插入或者更新该列数据,必须明确给出该列的值; DEFAULT表示该列的默认值,在插入行数据时,若没有给出该列的值就会使用其指定的默认值; PRIMARY KEY用于指定主键,...',cust_email='happy@gmail.com' WHERE cust_id = 1001; 注意:如果不加WHERE条件指定到某一行的话,会更新表中某一列全部的数据。...因此,与UPDATE子句相比,DELETE子句并不需要指定是哪一列,而仅仅只需要指定具体的表名即可; 注意:如果不添加WHERE指定条件的话,会将整个表中所有行数据全部删除。...,NEW中的值可以被更新;3.对于AUTO_INCREMENT列,NEW在INSERT执行之前包含0,在INSERT执行之后包含新的自定生成值。...,需要知道以下两点: 在DELETE触发器代码内,可以引用一个名为OLD的虚拟表,来访问被删除的行; OLD表中的数据只能读,不能被更新,而在INSERT触发器中,就可以通过NEW来更新被插入的行数据;
它使用的是列的位置,因此SELECT中的第一列(不管其列名)将用来填充表列中指定的第一个列,第二列将用来填充表列中指定的第二个列,如此等等 更新数据 update table_name set col_name...MySQL支持IN(传递给存储过程)、OUT(从存储过程传出,如这里所用)和INOUT(对存储过程传入和传出)类型的参数并通过指定INTO关键字来将处理结果保存在对应的变量中 为调用上述存储过程,使用下面方法...需要知道以下几点: 在INSERT触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行; 在BEFORE INSERT触发器中,NEW中的值也可以被更新(允许更改被插入的值); 对于AUTO_INCREMENT...需要知道以下两点: 在DELETE触发器代码内,你可以引用一个名为OLD的虚拟表,访问被删除的行; OLD中的值全都是只读的,不能更新 将删除的行保存到存档中 create trigger deleteorder...需要知道以下几点: 在UPDATE触发器代码中,你可以引用一个名为OLD的虚拟表访问以前(UPDATE语句前)的值,引用一个名为NEW的虚拟表访问新更新的值; 在BEFORE UPDATE触发器中,NEW
. frm文件的内容是不变的,不管是哪一个存储引擎在管理数据表,每个数据表也只有-一个相应的. frm文件。...(对于BLOB和TEXT数据列,你只有在指定了前缀长度的情况下才能创建-一个索引。)...外键不仅在数据行的插人操作中很有用,在删除和更新操作中也很有用。...级联更新也是可能的。比如说,如果利用瀑布式更新在student数据表里改变了某个学生的student_ id, score 数据表里与这个学生相对应的所有数据行的这个值也应该发生相应的改变。...也可以使用转义字符来转义字符串中的单引号和双引号。 当然,处理字符串中引号还有别的办法: 1、如果引号与字符串两端引号相同,双写该引号,如: ‘I can ’ ’ t.’
默认的情况下,当插入一条记录但并没 有指定TIMESTAMP这个列值时,MySQL会把TIMESTAMP列设为当前的时间。...CONVERT()函数改变指定字符串的默认字符集,在开始的章节中,向读者介绍使用GUI图形化安装配置工具进行MySQL的安装和配置,其中的一个步骤是可以选择MySQL的默认字符集。...20、更新或者删除表时必须指定WHERE子句吗? 在前面章节中可以看到,所有的UPDATE和DELETE语句全都在WHERE子句中指定了条 件。...23、MySQL存储过程和函数有什么区别? 在本质上它们都是存储程序。函数只能通过return语句返回单个值或者表对象;而存储过程 不允许执行return,但是可以通过out参数返回多个值。...mysqldump备份的文本文件实际是数据库的一个副本,使用该文件不仅可以在MySQL中恢 复数据库,而且通过对该文件的简单修改,可以使用该文件在SQL Server或者Sybase等其他数 据库中恢复数据库
默认的情况下,当插入一条记录但并没 有指定TIMESTAMP这个列值时,MySQL会把TIMESTAMP列设为当前的时间。...CONVERT()函数改变指定字符串的默认字符集,在开始的章节中,向读者介绍使用GUI图形化安装配置工具进行MySQL的安装和配置,其中的一个步骤是可以选择MySQL的默认字符集。...20、更新或者删除表时必须指定WHERE子句吗? 在前面章节中可以看到,所有的UPDATE和DELETE语句全都在WHERE子句中指定了条件。...23、MySQL存储过程和函数有什么区别? 在本质上它们都是存储程序。函数只能通过return语句返回单个值或者表对象;而存储过程不允许执行return,但是可以通过out参数返回多个值。...mysqldump备份的文本文件实际是数据库的一个副本,使用该文件不仅可以在MySQL中恢 复数据库,而且通过对该文件的简单修改,可以使用该文件在SQL Server或者Sybase等其他数 据库中恢复数据库
默认的情况下,当插入一条记录但并没有指定 TIMESTAMP 这个列值时, MySQL 会把 TIMESTAMP 列设为当前的时间。...CONVERT()函数改变指定字符串的默认字符集,在开始的章节中,向读者介绍使用 GUI 图形化安装配置工具进行 MySQL 的安装和配置,其中的一个步骤是可以选择 MySQL 的默认字符集。...换句话说,DISTINCT 关键字应用于所有列而不 仅是它后面的第一个指定列。...20 更新或者删除表时必须指定 WHERE 子句吗? 在前面章节中可以看到,所有的 UPDATE 和 DELETE 语句全都在 WHERE 子句中指定了条 件。...32 mysqldump 备份的文件只能在 MySQL 中使用吗 mysqldump 备份的文本文件实际是数据库的一个副本,使用该文件不仅可以在 MySQL 中恢 复数据库,而且通过对该文件的简单修改,
该表是innodb表,可以通过客户端更新此表来持久化配置,server重启不会丢失。...如果自server安装sys 系统库以来,该行配置从未被更改过,则该列值为NULL 为了减少对sys_config表直接读取的次数,sys 系统库中的视图、存储过程在需要使用到这些配置选项时,会优先检查这些配置选项对应的用户自定义配置选项变量...,而该触发器在5.7.x版本中新增了一个用户mysql.sys,且这俩触发器定义时指定了DEFINER=mysql.sys@localhost(表示该触发器只能用mysql.sys用户调用),so..该用户必须存在...用户,也有办法补救,比如:直接insert用户权限表或者drop掉触发器再指定INVOKER=mysql.sys@localhost) grant TRIGGER on sys.* to 'mysql.sys...触发器会将sys_config表的set_by列设置为当前用户名。
第七章 MySQL的高级特性 分区操作时,可以只针对某个区进行操作,而且在底层文件系统中的表现,分区是多个表文件,可以高效地利用多个硬件设备。...在选择分区时,成本可能很高,特别是针对范围和列表分区,因为每次都要计算和查找,特别是在存在大量分区的时候。 MySQL只有使用分区函数的列本身进行比较才能分区,而不能根据表达式的值进行分区。...存储代码的优点: 内部执行,离数据最近,在服务器上执行可以节省带宽和网络延迟。 代码重用。 简化代码的维护和版本更新。 通过暴露一下限制操作提升安全。 服务器会缓存存储过程的执行计划。 代码集中。...但是最终影响的是列的编码,只有当列没有指定编码时,才会需要默认值。...虽然utf8是一种多字节编码,但是在mysql内部通常使用一个 定长空间来存储字符串,一个编码时utf8的char(10)需要30个字节,但是varchar在磁盘中没有这个困扰,但是在临时表中就会分配最大可能的长度
、触发器、视图等。...mysql -h$ip -P$port -u$user -p 当我们通过连接器进入mysql以后会去权限表里查询我们的权限,本次连接的权限都依赖于此时读取到的权限,也就意味着 在本次连接断开之前即使管理员对权限进行了修改也不会生效...但是使用长连接后,内存通常涨的非常快,这是因为MySQL在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时候才释放。...我们可以通过,内存到达一定大小后杀掉连接再重新连接,如果你用的是MySQL 5.7或更新版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection来重新初始化连接资源...不过在mysql8.0中删掉了查询缓存,因为查询缓存往往弊大于利。 查询缓存经常频繁的失效,如果你在一张表中进行了更新操作,那么,这个表上所有的查询缓存都会被清空。
存储过程的代码位于BEGIN和END语句内,如前所见,它们是一些列SELECT语句,用来检索值,然后保存到相应的变量(通过INTO关键字) 调用修改过的存储过程必须指定3个变量名: CALL...FETCH指定检索什么数据(所需的要列),检索出来的数据存储在什么地方。...需要知道以下几点: 1 在INSERT触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行 2 在BEFORE INSERT触发器中,NEW中的值也可以被更新(允许更改插入的值) 3 对于AUTO_INCREMENT...列,NEW在INSERT执行之前包含0,在INSERT执行之后包含新的自动生成值 提示:通常BEFORE用于数据验证和净化(目的是保证插入表中的数据确实是需要的数据)。...的虚拟表访问新更新的值 2 在BEFORE UPDATE触发器中,NEW中的值可能被更新,(允许更改将要用于UPDATE语句中的值) 3 OLD中的值全都是只读的,不能更新 例子:保证州名的缩写总是大写
八、排序 ASC :升序(默认) DESC :降序 可以按多个列进行排序,并且为每个列指定不同的排序方式: SELECT * FROM mytable ORDER BY col1 DESC, col2...如果指定了 DELAY_KEY_WRITE 选项,在每次修改执行完成时,不会立即将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区,只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写入磁盘。...image.png image.png 一、乐观锁 总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改...当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。...2 触发器的作用(触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。) SQL触发器是存储在数据库目录中的一组SQL语句。
视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。 通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。...(三)视图的检查选项 当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如插入,更新,删除,以使其符合视图的定义。...(四)视图的更新 要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。...时,需要通过关键字delimiter指定SQL语句的结束符 。...mysql服务重新启动之后,所设置的全局参数会失效,要想不失效,可以在/etc/my.cnf中配置。
触发器是与表有关的数据库对象,可以在 insert、update、delete 之前或之后触发并执行触发器中定义的 SQL 语句。...乐观锁:每次查询数据时都认为别人不会修改,很乐观,但是更新时会判断一下在此期间别人有没有去更新这个数据。...整个数据处理中需要将数据加锁。悲观锁一般都是依靠关系型数据库提供的锁机制。 乐观锁每次自己操作数据的时候认为没有人会来修改它,所以不去加锁。 但是在更新的时候会去判断在此期间数据有没有被修改。...需要用户自己去实现,不会发生并发抢占资源,只有在提交操作的时候检查是否违反数据完整性。 方式一:给数据表中添加一个 version 列,每次更新后都将这个列的值加 1。...方式二:和版本号方式基本一样,给数据表中添加一个列,名称无所谓,数据类型需要是 timestamp。 每次更新后都将最新时间插入到此列。 读取数据时,将时间读取出来,在执行更新的时候,比较时间。
通过对需求的分析,在数据管理上初步决定采用关系数据库(MySQL)和数据库缓存(Redis) 的混合架构实现。 经过规范化设计之后,该系统的部分数据库表结构如下所示。...【答案1】 常用的反规范技术有增加冗余列、增加派生列、重新组表和分割表。 (1)增加冗余列。是指在多个表中具有相同的列,它常用来在查询时避免连接操作。 (2)增加派生列。...指增加的列来自其它表中的数据,由它们计算生成。它的作用是在查询时减少连接操作,避免使用聚集函数。 (3)重新组表。...请用200字以内的文字说明在反规范化设计中,解决数据不一致性问题的三种常见方法,并说明该系统应该采用哪种方法。 【答案2】 解决数据不一致性问题常用的方法是批处理维护、应用逻辑和触发器。...● 触发器∶对数据的任何修改立即触发对复制列或派生列的相应修改。触发器是实时的,易于维护,是解决这类问题的最好的办法。该系统应该采用触发器。
存储引擎负责MySQL中数据的存储和提取。Server层通过API与存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明。...值得一提的是在MySQL8.0中取消了查询缓存,大概的理由是查询缓存存在严重的可伸缩性问题,并且很容易成为严重的瓶颈缓存,将缓存移动到客户端能收获更好的性能。 ?...而对于确定要使用查询缓存的语句,可以用SQL_CACHE显式指定,如下: mysql> select SQL_CACHE * from T where ID=10; 上面也提到了MySQL8.0彻底废弃了查询缓存的功能...如果你还有一些疑问,比如优化器是怎么选择索引的,有没有可能选择错等等,没关系,我会在后面的文章中单独展开说明优化器的内容。...开始执行的时候,要先判断一下你对这个表T有没有执行查询的权限,如果没有,就会返回没有权限的错误,如下所示(在工程实现上,如果命中查询缓存,会在查询缓存放回结果的时候,做权限验证。
设置序列的开始值 序列的开始值默认为 1,但如果你需要指定一个开始值 100,那我们可以通过在创建表的时候指定: CREATE TABLE insect ( id INT UNSIGNED...你也可以在表创建成功后,通过以下语句来实现: ALTER TABLE t AUTO_INCREMENT = 100; 视图 MySQL 5 添加了对视图的支持。视图是虚拟的表。...在触发器中执行这种类型的处理的优点是它总是进行这种处理,而且是透明地进行,与客户机应用无关。 ❑ 触发器的一种非常有意义的使用是创建审计跟踪。...创建保留点: savepoint delete1; 回滚到指定保留点: rollback to delete1; 保留点越多越好 可以在 MySQL 代码中设置任意多的保留点,越多越好。为什么呢?...MySQL 的命令提示符使用,也可以在脚本中 使用,如 PHP 脚本。
MySQL可以识别出字符串中的转义序列,这就很尴尬: ? 那怎么办? 首先,这表里的转义序列是区分大小写的。 从上面这个表来看,可以使用\来转义\。...也可以使用转义字符来转义字符串中的单引号和双引号。 当然,处理字符串中引号还有别的办法: 1、如果引号与字符串两端引号相同,双写该引号,如: ‘I can ’ ’ t.’...在默认的情况下,MySQL按照以下规则处理“数据越界”和其他非正常数据: 对于数值数据列或TIME数据列,超出合法范围的值将被截短到最近的取值范围边界,然后把结果值存人数据库。...如果需要在插人或更新数据时进行更严格的检查,可以启用以下两种SQL模式之- : mysql> SET sql_ mode = ' STRICT_ALL_TABLES'; mysql> SET sql...在触发器的定义里需要表明它将由哪种语句(INSERT、UPDATE或DELETE)触发,是在数据行被修改之前还是之后被触发。
Like匹配整列,REGEXP是匹配列中;可以通过BINARY关键字区分大小;匹配特殊字符前必须用\\为前导,即转义; # 搜索prod_name 包含文本 1000 的所有行 select prod_id...@fudd.com' where cust_id = 10005; # UPDATE语句以WHERE子句结束,它告诉MySQL更新哪一行。...= 'elemer@fudd.com' where cust_id = 10005; # 在更新多个列时,只需要使用单个SET命令,每个“列=值”对之间用逗号分隔 update customers...在结束游标使用时,必须关闭游标。 在一个游标被打开后,可以使用FETCH语句分别访问它的每一行。FETCH指定检索什么数据(所需的列),检索出来的数据存储在什么地方。...每当订购一个产品时,都从库存数量中减去订购的数量; 无论何时删除一行,都在某个存档表中保留一个副本; 触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句: DELETE INSERT UPDATE
领取专属 10元无门槛券
手把手带您无忧上云