示例,创建了一个名为trig1的触发器,一旦在t_user表中有插入动作,就会自动往t_time表里插入当前时间 。
CREATE TRIGGER trig1 AFTER INSERTON t_user FOR EACH ROWINSERT INTO t_time VALUES(NOW());
创建有多个执行语句的触发器语法
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件ON 表名 FOR EACH ROWBEGIN执行语句列表END;
示例如下:
DELIMITER //CREATE TRIGGER trig2 AFTER INSERTON t_user FOR EACH ROWBEGININSERT INTO t_time VALUES(NOW());INSERT INTO t_time VALUES(NOW());END//DELIMITER ;
一旦插入成功,就会执行BEGIN ...END语句!
9.2、查询触发器
- 查询所有触发器
SHOW TRIGGERS;
- 查询指定的触发器
select * from information_schema.triggers where trigger_name='trig1';
所有触发器信息都存储在information_schema数据库下的triggers表中,可以使用SELECT语句查询,如果触发器信息过多,最好通过TRIGGER_NAME字段指定查询 。9.3、删除触发器
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
示例如下:DROP TRIGGER IF EXISTS trig1
删除触发器之后最好使用上面的方法查看一遍 。9.4、总结触发器尽量少的使用,因为不管如何,它还是很消耗资源,如果使用的话要谨慎的使用,确定它是非常高效的:触发器是针对每一行的;对增删改非常频繁的表上切记不要使用触发器,因为它会非常消耗资源 。
10、序列在 MySQL 中,可以有如下几种途径实现唯一值:
- 自增序列
- 程序自定义
- UUID() 函数
- UUID_SHORT() 函数
#创建一个表test_db,字段内容为id,namecreate table test_db(id int,name char(10));# 设置id主键alter table test_db add primary key(id);# 将id主键设置为自增长模式alter table test_db modify id int auto_increment;
这种模式,在单库单表的时候,没啥问题,但是如果要对test_db表进行分库分表,这个时候问题就来了,如果水平分库,这个时候向test_db_1、test_db_2中插入数据,就会出现相同的ID!10.2、程序自定义当然,为了避免出现这种情况,有的大神就自己单独创建了一张自增序列表,单独维护,这样就不会出现在分表的时候出现相同的ID!
实现过程也很简单!
- 1、创建一个序列表
CREATE TABLE `sequence` (`name` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '序列的名字',`current_value` int(11) NOT NULL COMMENT '序列的当前值',`increment` int(11) NOT NULL DEFAULT '1' COMMENT '序列的自增值',PRIMARY KEY (`name`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
- 2、创建–取当前值的函数
BEGINDECLARE value INTEGER;SET value = https://www.isolves.com/it/sjk/bk/2022-02-05/0;SELECT current_value INTO valueFROM sequenceWHERE name = seq_name;RETURN value; END
- 3、创建–取下一个值的函数
DROP FUNCTION IF EXISTS nextval; DELIMITER $ CREATE FUNCTION nextval (seq_name VARCHAR(50))RETURNS INTEGERLANGUAGE SQLDETERMINISTICCONTAINS SQLSQL SECURITY DEFINERCOMMENT '' BEGINUPDATE sequenceSET current_value = https://www.isolves.com/it/sjk/bk/2022-02-05/current_value + incrementWHERE name = seq_name;RETURN currval(seq_name); END $ DELIMITER ;
- 4、创建–更新当前值的函数
DROP FUNCTION IF EXISTS setval; DELIMITER $ CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)RETURNS INTEGERLANGUAGE SQLDETERMINISTICCONTAINS SQLSQL SECURITY DEFINERCOMMENT '' BEGINUPDATE sequenceSET current_value = https://www.isolves.com/it/sjk/bk/2022-02-05/valueWHERE name = seq_name;RETURN currval(seq_name); END $ DELIMITER ;
- 最后,直接通过函数调用,测试如下
# 添加一个sequence名称和初始值,以及自增幅度INSERT INTO sequence VALUES ('testSeq', 0, 1);#设置指定sequence的初始值SELECT SETVAL('testSeq', 10);#查询指定sequence的当前值SELECT CURRVAL('testSeq');#查询指定sequence的下一个值SELECT NEXTVAL('testSeq');
这方案,某种情况下解决了分表的问题,但是如果分库还是会出现相同的ID!10.3、UUID() 函数UUID 基于 16 进制,由 32 位小写的 16 进制数字组成,如下:
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
比如d0c754a8-178e-11eb-ae3d-2a7bea22ed3d就是一个典型的 UUID 。
推荐阅读
- Linux之killall命令
- 夏日泡泡小说中的经典语句
- 使用MySQL导入数据时出现乱码的两种解决方法
- c# 8个常用的.net类库
- Mysql Innodb 引擎解决并发问题
- 什么是MySQL存储引擎?
- MySQL七种JOIN类型,终于学明白了
- MySQL崩溃-修复损坏的innodb:innodb_force_recovery
- 常用的微信营销软件有哪些
- MySQL的select流程