Postgresql中自增主键序列的使用以及数据传输时提示:错误:关系"xxx_xx_xx_seq"不存在

发布时间 2023-12-19 15:08:06作者: 霸道流氓

场景

Postgresql在Windows中使用pg_dump实现数据库(指定表)的导出与导入:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/135011801

上面讲使用pg_dump进行postgresql的导出与导入。

如果使用Navicat可以直接连接两个库,则可直接使用数据传输功能。

但是在传输某个表时提示:

错误:关系“xxx_xx_seq”不存在 ..."id"

 

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi

实现

1、这是因为源表的id字段为自增主键,所以要在进行传输的表中执行新建自增主键序列的操作。

 

通过Navicat可以看到id字段为自增主键,且序列名为tunnel_topology_rel_seq

所以需要在目标表中进行创建自增序列的操作,创建之间先执行如果有则删除的操作。

Postgresql中执行删除和创建自增主键序列的语句:

DROP SEQUENCE IF EXISTS tunnel_topology_rel_seq;

CREATE SEQUENCE tunnel_topology_rel_seq;

执行成功之后

 

此时再执行数据传输则成功

 

 

2、pgsql里,有种东西叫自增,很像mysql里的约束。

建立一个自增的序列,每次需要获取自增主键时,调用一下这个序列就可以了。

建立自增主键的序列的语法:

CREATE SEQUENCE
test_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START WITH 1
CACHE 1;

语法含义:

INCREMENT BY : 每次序列增加(或减少)的步长
MINVALUE : 序列最小值,NO MINVALUE表示没有最小值
MAXVALUE : 序列最大值,NO MAXVALUE表示没有最大值
START WITH :以什么序列值开始
CYCLE : 序列是否循环使用
OWNED BY : 可以直接指定一个表的字段,也可以不指定。

为了测试新建一个user表

 

新建一个序列

CREATE SEQUENCE
user_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START WITH 1
CACHE 1;

 

序列的相关方法

currval( regclass )nextval( regclass )setval( regclass,bigint ,boolean )
函数返回类型描述
bigint 获取指定序列最近一次使用netxval后的数值,如果没有使用nextval而直接使用currval会出错
lastval() bigint 返回最近一次用 nextval 获取的任意序列的数值
bigint 递增序列并返回新值
setval( regclass,bigint ) bigint 设置序列的当前数值
bigint 设置序列的当前数值以及 is_called 标志,如果为true则立即生效,如果为false,则调用一次nextval后才会生效

3、postgresql中设置字段的默认值为序列的nextval

设置id字段的默认值为nextval('user_id_seq');

ALTER TABLE "public"."user" ALTER COLUMN id SET DEFAULT nextval('user_id_seq');

再向user表中插入数据,这样写

INSERT INTO "public"."user" ("name") VALUES ('霸道');

自增主键序列成功

 

4、postgreql中查看序列当前值

SELECT currval('user_id_seq')