PostgreSQL和 MySQL数据库还是有一定的区别。
下面了解一下 PGSQL的主键序列。
一、主键
1、系统自带主键序列
在 PostgreSQL 中,GENERATED BY DEFAULT
和 GENERATED ALWAYS
是用于定义自动生成的列(Generated Column)的选项。一般可作用在主键上。
- GENERATED ALWAYS: 表示该列是自动生成的,并且始终使用自动生成的自增值。如果你提供了一个值(不管这个值是否存在与表中),插入都会报错。
- GENERATED BY DEFAULT: 表示该列是自动生成的,可以使用你提供的值,如果你没有提供值,则会生成一个默认值。需要注意:使用它创建表做主键时,手动插入显示指定了ID值(不管是否从1开始),后面继续接着 不显示指定id值,系统总是从 1开始。会出现前面创建的id值已存在的重复。
实操总结:
- 一般情况,我们指定主键ID为 GENERATED ALWAYS类型。
- 不管你使用 GENERATED ALWAYS还是 GENERATED BY DEFAULT类型,或者两者类型来回切换,只要你显示插入ID值时,PostgreSQL的自动生成ID都不会更新(除非你手动修改序列值)。所以,插入SQL不要显示指定ID值。
2、序列值
2.1 查看序列的当前值
在 PostgreSQL 中,如果你使用 GENERATED BY DEFAULT 或 GENERATED ALWAYS 选项来定义一个自动生成的 ID 字段,而且没有显式地指定序列的名称,PostgreSQL 将会自动为该列生成一个名为 <table_name>_<column_name>_seq 的默认序列名称,其中:
- <table_name> 是表的名称,
- <column_name> 是自动生成 ID 的列名。
使用下面 SQL 查询语句来查看序列的当前值:
sql
SELECT last_value FROM your_table_name_your_column_name_seq;
-- 比如:查看用户表id序列值
SELECT last_value FROM user_id_seq;
也可以通过 Navicat的工具栏中的其他查看所有序列:
2.2 修改序列值
要修改当前序列的值,可以使用 PostgreSQL 中的 SETVAL 函数
。
sql
SELECT setval('your_sequence_name', new_value);
-- 比如:user_id_seq序列值改为15,下次插入时,id=16
SELECT setval('user_id_seq', 15);
-- 求知若饥,虚心若愚。