在 postgres 中重構用戶表的 ID

GET /users/:ID 是一個很是典型的 REST API。最近在瀏覽個人應用時,常常會有html

> GET /users/3 HTTP/1.1
> Host: shanyue.tech
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 404 Not Found
...
複製代碼

而個人用戶表的 ID 採用了整型自增的數據類型,爲了使個人網站的用戶數看起來不太寒磣,我絕對把個人用戶 id 拉長一些!sql

個人數據庫採用 postgresshell

本文連接: shanyue.tech/post/refact…數據庫

設置外鍵,同步更新

對全部用戶用戶表 ID 的關聯表設置外鍵,而且設置 on update cascade,使之當用戶表 ID 發生變化時,關聯表的 user_id 能夠同步更新bash

alter table todo add constraint todo_user_id_fkey foreign key (user_id) references users(id) on update cascade
複製代碼

遷移舊數據

把全部用戶的 ID 放大16倍,而且添加一個 10086 的基數。有一種拉麪的既視感..dom

注意如下第一條 SQL 有問題curl

-- update users set id = id * 16 + (random() * 16)::integer + 10086
update users set id = id * 16 + ceil(random() * 15) + 10086
複製代碼

若是以上語句沒有報錯,那就說明用戶量實在是太少了,若是數據量較多會發生主鍵衝突。post

採用負負得正的方法避免主鍵衝突網站

update users set id = id * -16 - ceil(random() * 15) + 10086
update users set id = -id
複製代碼

設置 Sequence

當舊有數據清理完畢,新增數據也採用自增 16 的方式,這裏須要熟悉 postgres 中 Sequence 的用戶,見最後參考ui

> select currval('users_id_seq')
currval
16
> alter SEQUENCE users_id_seq INCREMENT by 16
> select max(id) from users
max
20000
> select setval('users_id_seq', 20000)

複製代碼

why not uuid

由於它太長了,而個人用戶數又太少,它的優勢我不但吸收不到,還常常會面對一串字符的茫然...

參考


歡迎關注個人公衆號山月行,在這裏記錄着個人技術成長,歡迎交流

歡迎關注公衆號山月行,在這裏記錄個人技術成長,歡迎交流
相關文章
相關標籤/搜索