首页 > 解决方案 > 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)?

标签: postgresqlscalaquill.io

解决方案


至少可以通过 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 CONFLICTInsert, on duplicate update in PostgreSQL?


推荐阅读