This commit is contained in:
49
help/随机id生成
49
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();
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user