隨着業務量的增加和國際化的需求,多區域部署已經是屢見不鮮,若是各區域數據須要互通那數據庫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也是一種不錯的選擇。函數