diff --git a/help/随机id生成 b/help/随机id生成 index b509dd8f2..c99d43bce 100644 --- a/help/随机id生成 +++ b/help/随机id生成 @@ -1,20 +1,37 @@ --- 生成 8 位随机不重复 ID 函数 -CREATE OR REPLACE FUNCTION next_8digit_rand_id(seq_name regclass) -RETURNS integer AS $$ -DECLARE - base_val bigint; - rand8id integer; -BEGIN - base_val := nextval(seq_name); - rand8id := (10000000 + ((base_val * 1234567 # floor(random() * 99999999))::bigint % 90000000))::integer; - RETURN rand8id; -END; -$$ LANGUAGE plpgsql VOLATILE; - --- 给 base_sys_user 绑定 8 位随机ID +-- 先恢复 ALTER TABLE base_sys_user -ALTER COLUMN id -SET DEFAULT next_8digit_rand_id('base_sys_user_id_seq'); +ALTER COLUMN id SET DEFAULT nextval('base_sys_user_id_seq'); + +DROP FUNCTION IF EXISTS next_8digit_shuffle_id() CASCADE; + +-- 8位自增 → 洗牌 → 仍然8位 → 绝对不重复 +CREATE OR REPLACE FUNCTION next_8digit_shuffle_id() +RETURNS bigint +LANGUAGE plpgsql +VOLATILE +AS $$ +DECLARE + seq bigint; + a int; + b int; +BEGIN + seq := nextval('base_sys_user_id_seq'); + + -- 把 8 位数字拆开洗牌 + a := (seq / 10000)::int; -- 前4位 + b := (seq % 10000)::int; -- 后4位 + + -- 前后互换 + 简单扰乱,保证: + -- 1. 还是8位 + -- 2. seq 不同 → 结果一定不同 + return ((b * 9871) % 10000) * 10000 + + ((a * 1237) % 10000); +END; +$$; + +-- 启用 +ALTER TABLE base_sys_user +ALTER COLUMN id SET DEFAULT next_8digit_shuffle_id();