postgresql - 在非连续 ID 中插入结果
问题描述
我有以下查询:
INSERT INTO hosts (name, domain, ip)
SELECT name, domain, ip
FROM staging_hosts
ON CONFLICT (ip) DO UPDATE
SET name = excluded.name, domain = excluded.domain;
除了我的“主机”表中的 ID 没有按顺序递增的事实之外,它工作正常。例如,运行此查询后,我将获得以下新 ID:
114855
114859
114873
114977
117389
115326
hosts 表上的 ID 列是串行的,所以我不确定为什么 ID 会按顺序递增。
解决方案
如果您坚持最小化差距,您可以这样做,包括示例表:
CREATE TABLE foo (
id SERIAL PRIMARY KEY,
ip INT,
name TEXT,
UNIQUE(ip) );
CREATE TABLE staging (
ip INT,
name TEXT );
INSERT INTO foo (ip,name) VALUES (1,'hello'),(2,'abc'),(10,'world');
INSERT INTO staging VALUES (1,'byebye'),(2,'def'),(11,'world');
WITH s AS (
SELECT COALESCE( foo.id, nextval('foo_id_seq'::regclass)) AS id,
staging.ip,staging.name
FROM staging LEFT JOIN foo USING (ip))
INSERT INTO foo (id,ip,name) SELECT * FROM s
ON CONFLICT(id) DO UPDATE
SET ip=excluded.ip, name=excluded.name;
如果不需要,COALESCE 不会评估第二个参数,这意味着它只在需要时调用 nextval。
推荐阅读
- django - 创建新的 Django 应用程序时配置错误
- android - HMS 4.0 游戏浮标不显示 Games.getBuoyClient(activity).showFloatWindow();
- r - 从另一列 R 中按条件查找天数
- sql-server - Use a previous row value on where clause
- apollo - Apollo 客户端:cache.modify 不起作用?
- java - 使用堆栈检查给定表达式中的平衡括号
- android - 在 MotionLayout 内部查看不保留高程变化
- node.js - Next JS,Back 行为未调用 getInitialProps()
- artifactory - 为什么工件的渲染目录列表的读取访问行为不一致?
- php - 如何解决访问 laravel 路由时出现 CORS 错误