PostgreSQL数据库的序列
PostgreSQL数据库的序列
一、创建序列
执行以下 sql 创建序列并定义起始序列为 1,也可以自定义为其他值
CREATE SEQUENCE test_tables_id_seq START 1;
二、序列重置
第一种方式
执行以下 sql 修改起始序列为 1,也可以自定义为其他值
ALTER SEQUENCE test_tables_id_seq RESTART WITH 1;
ALTER SEQUENCE test_tables_id_seq RESTART WITH 100;
第二种方式
如表中已存在数据一般采用 MAX(id) 来做自适应,避免冲突报错
SELECT setval('test_tables_id_seq', (SELECT MAX(id) FROM test_tables));
三、查看序列值
当前值
SELECT currval('test_tables_id_seq')
例外一:如果你刚建表,且一条数据都没有插入,那么这时执行 select currval('test_id_seq') 会报错:
ERROR: currval of sequence "test_tables_id_seq" is not yet defined in this session
例外二:如果你使用第一种方式ALTER SEQUENCE test_tables_id_seq RESTART WITH 1;
刚重置完成序列,且没有执行插入操作,那么这是执行 select currval('test_id_seq') 依然是之前的值
下一个值
会导致序列 +1 哦
SELECT nextval('test_tables_id_seq')
四、怎么查看表关联的序列
第一种方式
通过表定义查看序列
CREATE TABLE "public"."test_tables" (
"id" int8 NOT NULL DEFAULT nextval('test_tables_id_seq'::regclass)
)
第二种方式
使用 SQL 查询 pg_catalog 或 information_schema**:编写 SQL 查询来从 pg_catalog 或 information_schema 模式中检索表的定义
SELECT
"column_name",
data_type,
character_maximum_length,
is_nullable,
column_default
FROM
information_schema."columns"
WHERE
"table_name" = 'test_tables'
AND table_schema = 'public';
结果
问题
- 如果表中没有数据不能使用
SELECT setval('test_tables_id_seq', (SELECT MAX(id) FROM test_tables));
方式没有生效。这种情况推荐使用ALTER SEQUENCE test_tables_id_seq RESTART WITH 1;
来进行重置
参考
15. 序列操作函数 CREATE SEQUENCE - postgres.cn
15. 序列操作函数 ALTER SEQUENCE - postgres.cn
15. 序列操作函数 DROP SEQUENCE - postgres.cn
本文来自博客园,作者:bigroc,转载请注明原文链接:https://www.cnblogs.com/bigroc/p/18296793
blog:http://www.bigroc.cn 博客园:https://www.cnblogs.com/bigroc