From d545093124c759e6706c7c36a14f0cb48e799fd6 Mon Sep 17 00:00:00 2001 From: xinian Date: Sun, 1 Mar 2026 01:16:26 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=96=E8=BE=91=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=87=AA=E5=A2=9Eid.sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- help/修改自增id.sql | 53 ++++++++++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/help/修改自增id.sql b/help/修改自增id.sql index 76150767b..362d8d4e2 100644 --- a/help/修改自增id.sql +++ b/help/修改自增id.sql @@ -1,26 +1,49 @@ select setval('base_sys_user_id_seq', 10000000, false); --- 1. 恢复原自增,解除依赖 +-- 清理旧函数 ALTER TABLE base_sys_user ALTER COLUMN id SET DEFAULT nextval('base_sys_user_id_seq'); --- 2. 清理旧函数 -DROP FUNCTION IF EXISTS next_8digit_rand_id() CASCADE; +DROP FUNCTION IF EXISTS shuffle_8digit() CASCADE; --- 3. 【终极版】不重复 + 乱序 + 固定8位 -CREATE OR REPLACE FUNCTION next_8digit_rand_id() +-- 8位自增 → 纯数字位置互换 → 依旧8位 → 100%不重复 +CREATE OR REPLACE FUNCTION shuffle_8digit() RETURNS bigint -LANGUAGE plpgsql VOLATILE +LANGUAGE plpgsql +VOLATILE AS $$ DECLARE - seq_val bigint; -BEGIN - seq_val := nextval('base_sys_user_id_seq'); - RETURN 10000000 + ((seq_val * 1103515245 + 12345) # 58329) % 90000000; -END; -$$; + seq bigint; + d0 int; d1 int; d2 int; d3 int; + d4 int; d5 int; d6 int; d7 int; + BEGIN + seq := nextval('base_sys_user_id_seq'); -- 原本就是8位 --- 4. 启用 -ALTER TABLE base_sys_user -ALTER COLUMN id SET DEFAULT next_8digit_rand_id(); + -- 把 8 位数字拆出来:d7 d6 d5 d4 d3 d2 d1 d0 + d7 := (seq / 10000000) % 10; + 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; + + -- 固定位置互换(一对一置换,绝对不重复) + RETURN + d3*10000000 + + d7*1000000 + + d1*100000 + + d5*10000 + + d2*1000 + + d6*100 + + d0*10 + + d4; + END; + $$; + + -- 启用 + ALTER TABLE base_sys_user + ALTER COLUMN id SET DEFAULT shuffle_8digit(); + \ No newline at end of file