常用SQL语句,看这篇就够了( 五 )

示例,创建了一个名为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() 函数
10.1、自增序列在mysql中,一般我们可以给某个主键字段设置为自增模式,例如:
#创建一个表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 。


推荐阅读