postgresql - Postgres:在 ON CONFLICT 中使用 MAX
问题描述
我有以下表架构:
CREATE TABLE table (
pk1 bigint,
pk2 bigint,
some_text varchar(4),
valid_until bigint,
PRIMARY KEY (pk1, pk2)
我想在此表中插入一条记录,以防发生冲突,valid_until
列的最终值是旧值和新值的最大值。
有没有可能实现?如果是 - 是否有可能以框架友好的方式进行(我正在使用 Scala Quill)?
解决方案
至少可以通过 SQL 来完成,我不确定你是否可以在 Quill 中完成它而无需单独选择数据。纯 SQL 版本看起来有点像(纯内存,所以可能有错误):
INSERT INTO table (42, 84, 'some_text', 9000)
ON CONFLICT DO UPDATE
SET some_text = 'some_text',
valid_until = (SELECT GREATEST(9000, valid_until) FROM table WHERE pk1=42 AND pk2=84 LIMIT 1));
希望这个想法可以让你继续前进 :) 你可以在 Quill 中以某种方式模仿它。通常我实际上会尽量避免尝试巧妙使用数据库的框架,它几乎总是最终再次成为 Hibernate 陷阱,在这种情况下,避免 SQL 的搜索最终会花费更多的成本,而不仅仅是这样做。也许 Scala 框架更好,至少 Scala 在设计这样的框架方面设计得更好,所以也许它在那里工作得更好。
如此处所述更新了答案ON CONFLICT
:
Insert, on duplicate update in PostgreSQL?
推荐阅读
- ios - 如何“解包” ForEach 的内容
- javascript - 我想用 JavaScript 在 Canvas 中创建几个移动的圆圈
- reactjs - 如何通过服务器端渲染在 Next.js 中执行需要动态变量的 POST 请求?
- django - 双向一对五 django
- javascript - 如何在开始滚动时更改光标 css 属性,并在停止滚动时再次更改光标属性
- laravel - Laravel - 使用 env 方法读取 .env.testing 变量
- vue.js - SyntaxError: 不能在模块外使用 import 语句。VUE3/JSX/VantUI
- excel - 从多个文件复制垂直排列的表格,并将它们水平粘贴到主文件中
- c++ - 将原始指针列表存储在向量中的替代方法
- swift - 使用 Timer 用颜色填充整个屏幕 - SwiftUI