场景
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')