探究postgres 自增列有值情况下插入时,如何维护主键id自增

环境

docker、postgres11.14、navicat

docker安装postgres

1.拉取镜像

docker pull postgres:11.14

2.创建挂载目录(可选)

mkdir -p /docker/postgresql/data/
如果没有挂载目录,自动创建。
位置:docker inspect id | grep Mounts -A 50 查看关于Mounts记录的50行
在这里插入图片描述
验证删除容器后,默认挂载目录不会消失,但是建议挂载,因为挂载volume id不好记
操作如下,docker stop $(docker ps -qa) && docker rm $(docker ps -qa)
然后重新启动docker,docker是ubuntu服务器版安装时snap自带的,所以没有在apt管理范围,service restart docker或者 systemctl restart docker无效, 应该是 snap restart docker

在这里插入图片描述

3.启动容器

docker run -d --name postgres -v /docker/postgresql/data/:/var/lib/postgresql/data -e POSTGRES_PASSWORD=123456 -p 5432:5432 postgres:11.14

-d 表示启动后在后台运行,不启动日志

-name 容器名 表示给容器命名

–restart always 表示如果容器死掉,会自动拉起,可以不配置

-v 宿主机路径:容器内路径 可选,把容器内路径挂载到宿主机路径,默认也有挂载路径

-p 宿主机端口:容器端口 把宿主机端口和容器内端口进行映射

-e POSTGRES_PASSWORD=123456 设置环境变量值,这里设置了数据库的密码

4.进入数据库

navicat连接,用户名默认为postgres,密码刚刚启动设置的值。

研究postgres的主键维护问题

mysql是否具有相同的问题?

首先,我们需要知道,mysql可以自动维护吗?oracle和postgres类似,也需要设置自增序列,很大可能性是不行的。

前提

创建一个b表,b中只有一个id列的主键,然后插入几条数据
注意:information_schema表不会实时更新,这是因为他有缓存,手动执行ANALYZE TABLE b来更新表的统计数据

过程

下面的过程中,没有执行ANALYZE TABLE b,所以统计结果不正确,但是可以从结果看到,插入带id数据后再插入不带id数据,不带id的数据会被自动更新

在这里插入图片描述

获取test_join数据库的b表主键的自增值(现在是10):

插入一条带id的数据,更新表统计信息,查看自增数据
在这里插入图片描述
在这里插入图片描述

AUTO_INCREMENT更新了, mysql会自动维护填写id值的自增序列。

postgres无法维护主键id自增研究过程

创建表和自增序列

CREATE TABLE "public"."a" (
  "id" int8 NOT NULL DEFAULT nextval('a_id'::regclass),
  "name" varchar(255) COLLATE "pg_catalog"."default",
  CONSTRAINT "a_pkey" PRIMARY KEY ("id")
);

CREATE SEQUENCE "public"."a_id" 
INCREMENT 1
MINVALUE  1
MAXVALUE 9223372036854775807
START 1
CACHE 1;

插入时自增序列的列有值情况下,现象:自增序列不会自动更新

下面是,先插入自动生成1,再插入一条10的记录,然后一直自动生成id,不会生成10之后的值,到10的时候,会失败,但是序列值会更新。
在这里插入图片描述

解决方案

导入数据之后,再手动执行一下各表的更新序列脚本。

select setval('a_id',(select max(id)+1 as id from a));
# or
select setval('a_id',(select max(id) as id from a)+1);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值