PostGresql更改自增ID值

2,952次阅读

共计 1562 个字符,预计需要花费 4 分钟才能阅读完成。

不知道你会不会遇到类似这样的情况,比如有一个 orders(订单) 表,我们把 ID 作为订单的 ID,方便查询以及前端的显示,但是默认情况下,ID 自增是从 1 开始的,为了前端显示的效果通常我们会将 ID 从 6(N)位数开始,这个时候就需要修改默认的自增起始值了。

基于这种情况我们来做以下的演示操作。

环境

  • 运行 postgresql

我这里通过 docker 的方式启动 postgresql

$ docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=zhiqiang.name postgres

默认的密码为zhiqiang.name

  • 版本

连接到 postgres 之后就会显示版本

$ psql -h localhost -U postgres
Password for user postgres:  # 输入密码
psql (11.2)
Type "help" for help.

postgres=# exit

创建建 orders 表

  • 创建 orders 表
create table orders
(
    id           serial,
    product_name varchar(100)
);

通过 serial 创建自增 ID,同时会创建属于这个表的自增序列,名为:orders_id_seq,并将 ID 字段设置为not null

  • 查看序列名称

使用命令:\d 表名

postgres=# \d orders
                                       Table "public.orders"
    Column    |          Type          | Collation | Nullable |              Default
--------------+------------------------+-----------+----------+------------------------------------
 id           | integer                |           | not null | nextval('orders_id_seq'::regclass)
 product_name | character varying(100) |           |          |

其中 orders_id_seq 就是序列的名称

  • 添加测试数据
insert into orders(product_name)
values ('MacMini'),
       ('MacBook'),
       ('iPhone');
  • 查看数据
postgres=# select * from orders;
 id | product_name
----+--------------
  1 | MacMini
  2 | MacBook
  3 | iPhone
(3 rows)

上述的数据 ID 是从 1 开始,然后依次递增。

更改自增 ID 的起始值

postgres=# SELECT setval('orders_id_seq', 100000, true); -- 下一个 ID 值为 100001
 setval
--------
 100000
(1 row)

如果 setval 的第三个值不添加为 true,下一个 ID 值为100000,设置为 true 则表示设置的当前序列值 +1

  • 插入数据
postgres=# insert into orders(product_name) values ('iPad');
INSERT 0 1
  • 查看
postgres=# select * from orders;
   id   | product_name
--------+--------------
      1 | MacMini
      2 | MacBook
      3 | iPhone
 100001 | iPad
(4 rows)

可以看到 iPad 的 ID 为100001

把当前最大的 ID 做为当前的 ID 自增起始值

postgres=# select setval('orders_id_seq', (select max(id) from orders));
 setval
--------
 100001
(1 row)

参考文献

正文完
 0
Blood.Cold
版权声明:本站原创文章,由 Blood.Cold 于2019-08-31发表,共计1562字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。