随着业务量的增加和国际化的需求,多区域部署已经是屡见不鲜,若是各区域数据须要互通那数据库id就要全局惟一,自建sequence做为一种自增id就是为了解决mysql多区域部署id冲突问题。mysql
检查mysql 自定义函数功能是否开启sql
执行show variables like '%log_bin_trust_function_creators%'
检查是否开启,如aws默认是没开启的须要修改数据库配置,执行SET GLOBAL log_bin_trust_function_creators=1;
打开该功能,如遇到权限问题修改原始配置数据库
建立sequence表bash
-- sequence表
DROP TABLE IF EXISTS sequence;
-- 建sequence表,指定seq列为大整型,可支持:0(default)到9223372036854775807(0到2^63–1)。
CREATE TABLE sequence (
name VARCHAR(50) NOT NULL, -- 表名
current_value BIGINT NOT NULL DEFAULT 0, -- 当前值
increment INT NOT NULL DEFAULT 1, -- 步长
PRIMARY KEY (name) -- 不容许重复seq的存在
) ENGINE=InnoDB;
复制代码
建立函数session
-- DELIMITER的做用是修改分隔符,由于语句中包含有分号须要替换成其余分隔符
DELIMITER /
DROP FUNCTION IF EXISTS currval /
CREATE FUNCTION currval(seq_name VARCHAR(50))
RETURNS BIGINT
BEGIN
DECLARE value BIGINT;
SELECT current_value INTO value
FROM sequence
WHERE upper(name) = upper(seq_name); -- 大小写不区分.
RETURN value;
END;
/
DELIMITER ;
复制代码
DELIMITER /
DROP FUNCTION IF EXISTS nextval /
CREATE FUNCTION nextval (seq_name VARCHAR(50))
RETURNS BIGINT
BEGIN
DECLARE value BIGINT;
UPDATE sequence
SET current_value = current_value + increment
WHERE upper(name) = upper(seq_name);
RETURN currval(seq_name);
END;
/
DELIMITER ;
复制代码
drop function 自定义函数名
show create function 自定义函数名
show function status
alert function
insert into `sequence`(`name`,`current_value`,`increment`) values('session',1000,2)
INSERT INTO `session`(`id`, `uid`, `sig`, `expired`) VALUES (nextval('session'),123,'1231',now())
因为nextval做为函数执行,不论sql执行是否成功,sequence都会增加,这和mysql自增id自己是同样的使用sequence做为mysql增加id惟一麻烦之处就在于要控制id段,若是id段划分过小容易出现id冲突,划分太大又容易出现新增区域id不足的问题,因此须要评估业务量,固然若是不在意id是否有序,使用snowflake生成uuid也是一种不错的选择。函数