在 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

由于它太长了,而个人用户数又太少,它的优势我不但吸收不到,还常常会面对一串字符的茫然...

参考


欢迎关注个人公众号山月行,在这里记录着个人技术成长,欢迎交流

欢迎关注公众号山月行,在这里记录个人技术成长,欢迎交流
相关文章
相关标签/搜索