This commit is contained in:
58
help/随机id生成
58
help/随机id生成
@@ -1,39 +1,57 @@
|
|||||||
-- 先恢复
|
-- 清理旧的
|
||||||
ALTER TABLE base_sys_user
|
ALTER TABLE base_sys_user
|
||||||
ALTER COLUMN id SET DEFAULT nextval('base_sys_user_id_seq');
|
ALTER COLUMN id SET DEFAULT nextval('base_sys_user_id_seq');
|
||||||
|
DROP FUNCTION IF EXISTS shuffle_9digit() CASCADE;
|
||||||
|
|
||||||
DROP FUNCTION IF EXISTS next_8digit_shuffle_id() CASCADE;
|
-- 9位乱序:首尾互换 + 中间全部打乱
|
||||||
|
-- 纯数字换位,100% 不重复,速度极快
|
||||||
-- 8位自增 → 洗牌 → 仍然8位 → 绝对不重复
|
CREATE OR REPLACE FUNCTION shuffle_9digit()
|
||||||
CREATE OR REPLACE FUNCTION next_8digit_shuffle_id()
|
|
||||||
RETURNS bigint
|
RETURNS bigint
|
||||||
LANGUAGE plpgsql
|
LANGUAGE plpgsql
|
||||||
VOLATILE
|
VOLATILE
|
||||||
AS $$
|
AS $$
|
||||||
DECLARE
|
DECLARE
|
||||||
seq bigint;
|
seq bigint;
|
||||||
a int;
|
d0 int; -- 原最后一位
|
||||||
b int;
|
d1 int;
|
||||||
|
d2 int;
|
||||||
|
d3 int;
|
||||||
|
d4 int;
|
||||||
|
d5 int;
|
||||||
|
d6 int;
|
||||||
|
d7 int; -- 原第一位
|
||||||
BEGIN
|
BEGIN
|
||||||
seq := nextval('base_sys_user_id_seq');
|
seq := nextval('base_sys_user_id_seq'); -- 8位自增
|
||||||
|
|
||||||
-- 把 8 位数字拆开洗牌
|
-- 拆分 8 位:d7 d6 d5 d4 d3 d2 d1 d0
|
||||||
a := (seq / 10000)::int; -- 前4位
|
d7 := (seq / 10000000) % 10;
|
||||||
b := (seq % 10000)::int; -- 后4位
|
d6 := (seq / 1000000) % 10;
|
||||||
|
d5 := (seq / 100000) % 10;
|
||||||
|
d4 := (seq / 10000) % 10;
|
||||||
|
d3 := (seq / 1000) % 10;
|
||||||
|
d2 := (seq / 100) % 10;
|
||||||
|
d1 := (seq / 10) % 10;
|
||||||
|
d0 := seq % 10;
|
||||||
|
|
||||||
-- 前后互换 + 简单扰乱,保证:
|
-- 构造成 9 位,规则:
|
||||||
-- 1. 还是8位
|
-- 1. 首尾互换(原最后一位放第1位,原第1位放最后)
|
||||||
-- 2. seq 不同 → 结果一定不同
|
-- 2. 中间全部打乱位置
|
||||||
return ((b * 9871) % 10000) * 10000
|
RETURN
|
||||||
+ ((a * 1237) % 10000);
|
d0 * 100000000 + -- 原最后一位 → 第1位
|
||||||
|
d3 * 10000000 +
|
||||||
|
d1 * 1000000 +
|
||||||
|
d5 * 100000 +
|
||||||
|
d2 * 10000 +
|
||||||
|
d6 * 1000 +
|
||||||
|
d4 * 100 +
|
||||||
|
d7 * 10 +
|
||||||
|
d0; -- 原第一位 → 第9位
|
||||||
END;
|
END;
|
||||||
$$;
|
$$;
|
||||||
|
|
||||||
-- 启用
|
-- 启用
|
||||||
ALTER TABLE base_sys_user
|
ALTER TABLE base_sys_user
|
||||||
ALTER COLUMN id SET DEFAULT next_8digit_shuffle_id();
|
ALTER COLUMN id SET DEFAULT shuffle_9digit();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ALTER TABLE base_sys_user
|
ALTER TABLE base_sys_user
|
||||||
|
|||||||
Reference in New Issue
Block a user