1
2
3
4
5
6
7
|
CREATE FUNCTION fun1(i1 int ,i2 int ) RETURNS INT / / 设置返回类型 BEGIN DECLARE sum int default 0 ; set sum = i1 + i2; RETURN( sum ); / / 返回结果 END |
3、调用自定义函数
1
2
3
4
5
|
#直接调用自定义函数 select fun1( 1 , 5 ); #在sql语句中使用自定义函数 select fun1(参数 1 ,参数 2 ),name from 表名 |
4、删除自定义函数
1
|
DROP FUNCTION fun_name; |
5、函数与存储过程的区别
函数 | 存储过程 |
一般用于计算数据 | 完成特定任务 |
声明为 FUNCTION | 声明为 PROCEDURE |
需要描述返回类型,且PL/SQL块中至少有一个有效的RETURN语句 | 无返回类型,可通过IN、OUT、INOUT参数返回多个值 |
不能独立运行,必须作为表达式的一部分 | 可作为一个独立的PL/SQL语句运行 |
在 DML 和 DQL 中可调用函数 | 在 DML 和 DQL 中不可调用过程 |
函数接收参数,并返回一个值。
存储过程接收参数,并创造一个返回值,还可以执行sql语句,并把结果返回。
五、事务
1、事务概念
一组SQL语句批量执行,要么全部执行成功,要么全部执行失败
2、事务的作用
为了解决如今多用户、多程序、多线程情况下对同一个表可能同时有很多人在用,为保持数据的一致性,所以有了事务的概念。
3、事务的特性
- 原子性(Atom):对于其数据修改,要么全都执行,要么全都不执行。
- 一致性(Consistent):数据库原来有什么样的约束,事务执行之后还需要存在这样的约束,所有规则都必须应用于事务的修改,以保持所有数据的完整性。
- 隔离性(Isolate):一个事务不能知道另外一个事务的执行情况(中间状态)
- 持久性(Durable):即使出现致命的系统故障也将一直保持。
- 注意:
-
- 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
- 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
- 事务用来管理 insert/update/delete 语句
-
4、事务控制语句
- BEGIN 或 START TRANSACTION;显式地开启一个事务;
- COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的;
- ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
- SAVEPOINT : 保存点,可以把一个事物分割成几部分.在执行ROLLBACK时可以指定在什么位置上进行回滚操作.
- 注意: SET AUTOCOMMIT=0禁止自动提交和SET AUTOCOMMIT=1开启自动提交.
六、数据库锁
1、锁的基本概念
当并发事务同时访问一个资源时,有可能导致数据不一致,因此需要一种机制来将数据访问顺序化,以保证数据库数据的一致性。
2、锁的基本类型
- 多个事务同时读取一个对象的时候,是不会有冲突的。同时读和写,或者同时写才会产生冲突。
因此为了提高数据库的并发性能,通常会定义两种锁:共享锁和排它锁。 - 共享锁(Shared Lock,也叫S锁)
共享锁(S)表示对数据进行读操作。因此多个事务可以同时为一个对象加共享锁。
(如果试衣间的门还没被锁上,顾客都能够同时进去参观) - 排他锁(Exclusive Lock,也叫X锁)
排他锁(X)表示对数据进行写操作。如果一个事务对 对象加了排他锁,其他事务就不能再给它加任何锁了。
(某个顾客把试衣间从里面反锁了,其他顾客想要使用这个试衣间,就只有等待锁从里面给打开了)
3、实际开发中常见的两种锁
- 悲观锁
行为悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block(阻塞)直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制.
注意:要使用悲观锁,我们必须关闭mysql数据库的自动提交属性.因为MySQL默认使用autocommit模式,也就是说,当你执行一个更新操作后,MySQL会立刻将结果进行提交。关闭自动提交命令为:set autocommit=0;
注意:在使用悲观锁时,如果表中没有指定主键,则会进行锁表操作.
注意: 悲观锁的确保了数据的安全性,在数据被操作的时候锁定数据不被访问,但是这样会带来很大的性能问题。
因此悲观锁在实际开发中使用是相对比较少的。 - 乐观锁(需要自行实现)
行为乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。 - 实现的两种方式:
- 使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录 的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。
- 同样是在需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳 (datatime), 和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。
4、悲观锁类乐观锁的优缺点
- 乐观锁适用于写入比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量
- 但如果经常产生冲突,上层应用会不断的进行重试操作,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适
锁的用法示例
1
2
3
4
5
6
7
8
9
|
- 终端: begin; select xx from xx for update; #必须加 commit; - pymysql cursor.execute( ‘select * from xx for update‘ ) - django #事务 with trancation.automic(): models.User.objects. all ().for_update() |
七、数据库备份
1、mysqldump命令实现备份
mysqldump 命令将数据库中的数据备份成一个文本文件。表的结构和表中的数据将存储在生成的文本文件中。
mysqldump命令的工作原理很简单。它先查出需要备份的表的结构,再在文本文件中生成一个CREATE语句。
然后,将表中的所有记录转换成一条INSERT语句。然后通过这些语句,就能够创建表并插入数据。
2、使用mysqldump实现逻辑备份
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#语法: # mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql #示例: #单库备份 mysqldump - uroot - p123456 db1 > c: / db1.sql mysqldump - uroot - p123456 db1 table1 table2 > c: / db1 - table1 - table2.sql #多库备份 mysqldump - uroot - p123456 - - databases db1 db2 mysql db3 > c: / db1_db2_mysql_db3.sql #备份所有库 mysqldump - uroot - p123456 - - all - databases > c: / all .sql 注意:可能MySQL5. 7 的用户在使用mysqldump备份时会报错 mysqldump: unkown option ‘--no-beep‘ ,处理办法如下: 1. 删除my.ini [client]下的 no - beep 参数; 2. 在 mysqldump 后加 - - no - defaults参数,即:mysqldump - - no - defualts - h主机IP - u用户名 - p密码 数据库 > xxx.sql |
3、恢复逻辑备份
1
2
3
4
5
|
#在mysql命令下,用source命令导入备份文件: mysql> USE 数据库名; mysql> source 备份文件.sql; 注意:只能在cmd界面下执行source命令,不能在mysql工具里面执行source命令,会报错,因为cmd是直接调用mysql.exe来执行命令的。 |
4、Mysqldump命令补充
1 --all-databases , -A 2 导出全部数据库。 3 mysqldump -uroot -p --all-databases 4 --all-tablespaces , -Y 5 导出全部表空间。 6 mysqldump -uroot -p --all-databases --all-tablespaces 7 --no-tablespaces , -y 8 不导出任何表空间信息。 9 mysqldump -uroot -p --all-databases --no-tablespaces 10 --add-drop-database 11 每个数据库创建之前添加drop数据库语句。 12 mysqldump -uroot -p --all-databases --add-drop-database 13 --add-drop-table 14 每个数据表创建之前添加drop数据表语句。(默认为打开状态,使用--skip-add-drop-table取消选项) 15 mysqldump -uroot -p --all-databases (默认添加drop语句) 16 mysqldump -uroot -p --all-databases –skip-add-drop-table (取消drop语句) 17 --add-locks 18 在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(默认为打开状态,使用--skip-add-locks取消选项) 19 mysqldump -uroot -p --all-databases (默认添加LOCK语句) 20 mysqldump -uroot -p --all-databases –skip-add-locks (取消LOCK语句) 21 --allow-keywords 22 允许创建是关键词的列名字。这由表名前缀于每个列名做到。 23 mysqldump -uroot -p --all-databases --allow-keywords 24 --apply-slave-statements 25 在‘CHANGE MASTER‘前添加‘STOP SLAVE‘,并且在导出的最后添加‘START SLAVE‘。 26 mysqldump -uroot -p --all-databases --apply-slave-statements 27 --character-sets-dir 28 字符集文件的目录 29 mysqldump -uroot -p --all-databases --character-sets-dir=/usr/local/mysql/share/mysql/charsets 30 --comments 31 附加注释信息。默认为打开,可以用--skip-comments取消 32 mysqldump -uroot -p --all-databases (默认记录注释) 33 mysqldump -uroot -p --all-databases --skip-comments (取消注释) 34 --compatible 35 导出的数据将和其它数据库或旧版本的MySQL 相兼容。值可以为ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options等, 36 要使用几个值,用逗号将它们隔开。它并不保证能完全兼容,而是尽量兼容。 37 mysqldump -uroot -p --all-databases --compatible=ansi 38 --compact 39 导出更少的输出信息(用于调试)。去掉注释和头尾等结构。可以使用选项:--skip-add-drop-table --skip-add-locks --skip-comments --skip-disable-keys 40 mysqldump -uroot -p --all-databases --compact 41 --complete-insert, -c 42 使用完整的insert语句(包含列名称)。这么做能提高插入效率,但是可能会受到max_allowed_packet参数的影响而导致插入失败。 43 mysqldump -uroot -p --all-databases --complete-insert 44 --compress, -C 45 在客户端和服务器之间启用压缩传递所有信息 46 mysqldump -uroot -p --all-databases --compress 47 --create-options, -a 48 在CREATE TABLE语句中包括所有MySQL特性选项。(默认为打开状态) 49 mysqldump -uroot -p --all-databases 50 --databases, -B 51 导出几个数据库。参数后面所有名字参量都被看作数据库名。 52 mysqldump -uroot -p --databases test mysql 53 --debug 54 输出debug信息,用于调试。默认值为:d:t,/tmp/mysqldump.trace 55 mysqldump -uroot -p --all-databases --debug 56 mysqldump -uroot -p --all-databases --debug=” d:t,/tmp/debug.trace” 57 --debug-check 58 检查内存和打开文件使用说明并退出。 59 mysqldump -uroot -p --all-databases --debug-check 60 --debug-info 61 输出调试信息并退出 62 mysqldump -uroot -p --all-databases --debug-info 63 --default-character-set 64 设置默认字符集,默认值为utf8 65 mysqldump -uroot -p --all-databases --default-character-set=utf8 66 --delayed-insert 67 采用延时插入方式(INSERT DELAYED)导出数据 68 mysqldump -uroot -p --all-databases --delayed-insert 69 --delete-master-logs 70 master备份后删除日志. 这个参数将自动激活--master-data。 71 mysqldump -uroot -p --all-databases --delete-master-logs 72 --disable-keys 73 对于每个表,用/*!40000 ALTER TABLE tbl_name DISABLE KEYS */;和/*!40000 ALTER TABLE tbl_name ENABLE KEYS */;语句引用INSERT语句。这样可以更快地导入dump出来的文件,因为它是在插入所有行后创建索引的。该选项只适合MyISAM表,默认为打开状态。 74 mysqldump -uroot -p --all-databases 75 --dump-slave 76 该选项将主的binlog位置和文件名追加到导出数据的文件中(show slave status)。设置为1时,将会以CHANGE MASTER命令输出到数据文件;设置为2时,会在change前加上注释。该选项将会打开--lock-all-tables,除非--single-transaction被指定。该选项会自动关闭--lock-tables选项。默认值为0。 77 mysqldump -uroot -p --all-databases --dump-slave=1 78 mysqldump -uroot -p --all-databases --dump-slave=2 79 --master-data 80 该选项将当前服务器的binlog的位置和文件名追加到输出文件中(show master status)。如果为1,将会输出CHANGE MASTER 命令;如果为2,输出的CHANGE MASTER命令前添加注释信息。该选项将打开--lock-all-tables 选项,除非--single-transaction也被指定(在这种情况下,全局读锁在开始导出时获得很短的时间;其他内容参考下面的--single-transaction选项)。该选项自动关闭--lock-tables选项。 81 mysqldump -uroot -p --host=localhost --all-databases --master-data=1; 82 mysqldump -uroot -p --host=localhost --all-databases --master-data=2; 83 --events, -E 84 导出事件。 85 mysqldump -uroot -p --all-databases --events 86 --extended-insert, -e 87 使用具有多个VALUES列的INSERT语法。这样使导出文件更小,并加速导入时的速度。默认为打开状态,使用--skip-extended-insert取消选项。 88 mysqldump -uroot -p --all-databases 89 mysqldump -uroot -p --all-databases--skip-extended-insert (取消选项) 90 --fields-terminated-by 91 导出文件中忽略给定字段。与--tab选项一起使用,不能用于--databases和--all-databases选项 92 mysqldump -uroot -p test test --tab=”/home/mysql” --fields-terminated-by=”#” 93 --fields-enclosed-by 94 输出文件中的各个字段用给定字符包裹。与--tab选项一起使用,不能用于--databases和--all-databases选项 95 mysqldump -uroot -p test test --tab=”/home/mysql” --fields-enclosed-by=”#” 96 --fields-optionally-enclosed-by 97 输出文件中的各个字段用给定字符选择性包裹。与--tab选项一起使用,不能用于--databases和--all-databases选项 98 mysqldump -uroot -p test test --tab=”/home/mysql” --fields-enclosed-by=”#” --fields-optionally-enclosed-by =”#” 99 --fields-escaped-by 100 输出文件中的各个字段忽略给定字符。与--tab选项一起使用,不能用于--databases和--all-databases选项 101 mysqldump -uroot -p mysql user --tab=”/home/mysql” --fields-escaped-by=”#” 102 --flush-logs 103 开始导出之前刷新日志。 104 请注意:假如一次导出多个数据库(使用选项--databases或者--all-databases),将会逐个数据库刷新日志。除使用--lock-all-tables或者--master-data外。在这种情况下,日志将会被刷新一次,相应的所以表同时被锁定。因此,如果打算同时导出和刷新日志应该使用--lock-all-tables 或者--master-data 和--flush-logs。 105 mysqldump -uroot -p --all-databases --flush-logs 106 --flush-privileges 107 在导出mysql数据库之后,发出一条FLUSH PRIVILEGES 语句。为了正确恢复,该选项应该用于导出mysql数据库和依赖mysql数据库数据的任何时候。 108 mysqldump -uroot -p --all-databases --flush-privileges 109 --force 110 在导出过程中忽略出现的SQL错误。 111 mysqldump -uroot -p --all-databases --force 112 --help 113 显示帮助信息并退出。 114 mysqldump --help 115 --hex-blob 116 使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用该选项。影响到的字段类型有BINARY、VARBINARY、BLOB。 117 mysqldump -uroot -p --all-databases --hex-blob 118 --host, -h 119 需要导出的主机信息 120 mysqldump -uroot -p --host=localhost --all-databases 121 --ignore-table 122 不导出指定表。指定忽略多个表时,需要重复多次,每次一个表。每个表必须同时指定数据库和表名。例如:--ignore-table=database.table1 --ignore-table=database.table2 …… 123 mysqldump -uroot -p --host=localhost --all-databases --ignore-table=mysql.user 124 --include-master-host-port 125 在--dump-slave产生的‘CHANGE MASTER TO..‘语句中增加‘MASTER_HOST=<host>,MASTER_PORT=<port>‘ 126 mysqldump -uroot -p --host=localhost --all-databases --include-master-host-port 127 --insert-ignore 128 在插入行时使用INSERT IGNORE语句. 129 mysqldump -uroot -p --host=localhost --all-databases --insert-ignore 130 --lines-terminated-by 131 输出文件的每行用给定字符串划分。与--tab选项一起使用,不能用于--databases和--all-databases选项。 132 mysqldump -uroot -p --host=localhost test test --tab=”/tmp/mysql” --lines-terminated-by=”##” 133 --lock-all-tables, -x 134 提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭--single-transaction 和--lock-tables 选项。 135 mysqldump -uroot -p --host=localhost --all-databases --lock-all-tables 136 --lock-tables, -l 137 开始导出前,锁定所有表。用READ LOCAL锁定表以允许MyISAM表并行插入。对于支持事务的表例如InnoDB和BDB,--single-transaction是一个更好的选择,因为它根本不需要锁定表。 138 请注意当导出多个数据库时,--lock-tables分别为每个数据库锁定表。因此,该选项不能保证导出文件中的表在数据库之间的逻辑一致性。不同数据库表的导出状态可以完全不同。 139 mysqldump -uroot -p --host=localhost --all-databases --lock-tables 140 --log-error 141 附加警告和错误信息到给定文件 142 mysqldump -uroot -p --host=localhost --all-databases --log-error=/tmp/mysqldump_error_log.err 143 --max_allowed_packet 144 服务器发送和接受的最大包长度。 145 mysqldump -uroot -p --host=localhost --all-databases --max_allowed_packet=10240 146 --net_buffer_length 147 TCP/IP和socket连接的缓存大小。 148 mysqldump -uroot -p --host=localhost --all-databases --net_buffer_length=1024 149 --no-autocommit 150 使用autocommit/commit 语句包裹表。 151 mysqldump -uroot -p --host=localhost --all-databases --no-autocommit 152 --no-create-db, -n 153 只导出数据,而不添加CREATE DATABASE 语句。 154 mysqldump -uroot -p --host=localhost --all-databases --no-create-db 155 --no-create-info, -t 156 只导出数据,而不添加CREATE TABLE 语句。 157 mysqldump -uroot -p --host=localhost --all-databases --no-create-info 158 --no-data, -d 159 不导出任何数据,只导出数据库表结构。 160 mysqldump -uroot -p --host=localhost --all-databases --no-data 161 --no-set-names, -N 162 等同于--skip-set-charset 163 mysqldump -uroot -p --host=localhost --all-databases --no-set-names 164 --opt 165 等同于--add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, --disable-keys 该选项默认开启, 可以用--skip-opt禁用. 166 mysqldump -uroot -p --host=localhost --all-databases --opt 167 --order-by-primary 168 如果存在主键,或者第一个唯一键,对每个表的记录进行排序。在导出MyISAM表到InnoDB表时有效,但会使得导出工作花费很长时间。 169 mysqldump -uroot -p --host=localhost --all-databases --order-by-primary 170 --password, -p 171 连接数据库密码 172 --pipe(windows系统可用) 173 使用命名管道连接mysql 174 mysqldump -uroot -p --host=localhost --all-databases --pipe 175 --port, -P 176 连接数据库端口号 177 --protocol 178 使用的连接协议,包括:tcp, socket, pipe, memory. 179 mysqldump -uroot -p --host=localhost --all-databases --protocol=tcp 180 --quick, -q 181 不缓冲查询,直接导出到标准输出。默认为打开状态,使用--skip-quick取消该选项。 182 mysqldump -uroot -p --host=localhost --all-databases 183 mysqldump -uroot -p --host=localhost --all-databases --skip-quick 184 --quote-names,-Q 185 使用(`)引起表和列名。默认为打开状态,使用--skip-quote-names取消该选项。 186 mysqldump -uroot -p --host=localhost --all-databases 187 mysqldump -uroot -p --host=localhost --all-databases --skip-quote-names 188 --replace 189 使用REPLACE INTO 取代INSERT INTO. 190 mysqldump -uroot -p --host=localhost --all-databases --replace 191 --result-file, -r 192 直接输出到指定文件中。该选项应该用在使用回车换行对(\r\n)换行的系统上(例如:DOS,Windows)。该选项确保只有一行被使用。 193 mysqldump -uroot -p --host=localhost --all-databases --result-file=/tmp/mysqldump_result_file.txt 194 --routines, -R 195 导出存储过程以及自定义函数。 196 mysqldump -uroot -p --host=localhost --all-databases --routines 197 --set-charset 198 添加‘SET NAMES default_character_set‘到输出文件。默认为打开状态,使用--skip-set-charset关闭选项。 199 mysqldump -uroot -p --host=localhost --all-databases 200 mysqldump -uroot -p --host=localhost --all-databases --skip-set-charset 201 --single-transaction 202 该选项在导出数据之前提交一个BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于多版本存储引擎,仅InnoDB。本选项和--lock-tables 选项是互斥的,因为LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用--quick 选项。 203 mysqldump -uroot -p --host=localhost --all-databases --single-transaction 204 --dump-date 205 将导出时间添加到输出文件中。默认为打开状态,使用--skip-dump-date关闭选项。 206 mysqldump -uroot -p --host=localhost --all-databases 207 mysqldump -uroot -p --host=localhost --all-databases --skip-dump-date 208 --skip-opt 209 禁用–opt选项. 210 mysqldump -uroot -p --host=localhost --all-databases --skip-opt 211 --socket,-S 212 指定连接mysql的socket文件位置,默认路径/tmp/mysql.sock 213 mysqldump -uroot -p --host=localhost --all-databases --socket=/tmp/mysqld.sock 214 --tab,-T 215 为每个表在给定路径创建tab分割的文本文件。注意:仅仅用于mysqldump和mysqld服务器运行在相同机器上。注意使用--tab不能指定--databases参数 216 mysqldump -uroot -p --host=localhost test test --tab="/home/mysql" 217 --tables 218 覆盖--databases (-B)参数,指定需要导出的表名,在后面的版本会使用table取代tables。 219 mysqldump -uroot -p --host=localhost --databases test --tables test 220 --triggers 221 导出触发器。该选项默认启用,用--skip-triggers禁用它。 222 mysqldump -uroot -p --host=localhost --all-databases --triggers 223 --tz-utc 224 在导出顶部设置时区TIME_ZONE=‘+00:00‘ ,以保证在不同时区导出的TIMESTAMP 数据或者数据被移动其他时区时的正确性。 225 mysqldump -uroot -p --host=localhost --all-databases --tz-utc 226 --user, -u 227 指定连接的用户名。 228 --verbose, --v 229 输出多种平台信息。 230 --version, -V 231 输出mysqldump版本信息并退出 232 --where, -w 233 只转储给定的WHERE条件选择的记录。请注意如果条件包含命令解释符专用空格或字符,一定要将条件引用起来。 234 mysqldump -uroot -p --host=localhost --all-databases --where=” user=’root’” 235 --xml, -X 236 导出XML格式. 237 mysqldump -uroot -p --host=localhost --all-databases --xml 238 --plugin_dir 239 客户端插件的目录,用于兼容不同的插件版本。 240 mysqldump -uroot -p --host=localhost --all-databases --plugin_dir=”/usr/local/lib/plugin” 241 --default_auth 242 客户端插件默认使用权限。 243 mysqldump -uroot -p --host=localhost --all-databases --default-auth=”/usr/local/lib/plugin/<PLUGIN>”
八、事件
1、事件
- 事件(event)是MySQL在相应的时刻调用的过程式数据库对象。一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器”。
- 事件和触发器类似,都是在某些事情发生的时候启动。当数据库上启动一条语句的时候,触发器就启动了,而事件是根据调度事件来启动的。由于他们彼此相似,所以事件也称为临时性触发器。
- 事件取代了原先只能由操作系统的计划任务来执行的工作,而且MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次。
2、事件的优缺点
- 优点
- 一些对数据定时性操作不再依赖外部程序,而直接使用数据库本身提供的功能。
- 可以实现每秒钟执行一个任务,这在一些对实时性要求较高的环境下就非常实用了。
- 缺点
- 定时触发,不可以调用。
3、事件的创建
- 一条create event语句创建一个事件。每个事件由两个主要部分组成,第一部分是事件调度(event schedule),表示事件何时启动以及按什么频率启动,第二部分是事件动作(event action),这是事件启动时执行的代码,事件的动作包含一条SQL语句,它可能是一个简单地insert或者update语句,也可以使一个存储过程或者 begin…end语句块,这两种情况允许我们执行多条SQL。一个事件可以是活动(打开)的或停止(关闭)的,活动意味着事件调度器检查事件动作是否必须调用,停止意味着事件的声明存储在目录中,但调度器不会检查它是否应该调用。在一个事件创建之后,它立即变为活动的,一个活动的事件可以执行一次或者多次。
- 创建语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
CREATE [DEFINER = { user | CURRENT_USER }] EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE | DISABLE ON SLAVE] [COMMENT ‘comment‘ ] DO event_body; schedule: AT timestamp [ + INTERVAL interval] ... | EVERY interval [STARTS timestamp [ + INTERVAL interval] ...] [ENDS timestamp [ + INTERVAL interval] ...] interval: quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND} |