Postgres:在 ON CONFLICT 中使用 MAX

Postgres: use MAX in ON CONFLICT

我有以下 table 架构:

CREATE TABLE table (
   pk1 bigint,
   pk2 bigint,
   some_text varchar(4),
   valid_until bigint,
   PRIMARY KEY (pk1, pk2)

我想在此 table 中插入一条记录,在发生冲突的情况下,valid_until 列的最终值是旧值和新值中的最大值。

是否可以实现?如果是 - 是否有可能以框架友好的方式进行(我正在使用 Scala Quill)?

至少可以通过 SQL 来完成,我不确定您是否可以在 Quill 中完成它而无需单独 select 数据。纯 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-trap,而避免 SQL 的搜索最终比仅仅这样做花费更多.也许 Scala 框架更好,至少 Scala 在设计此类框架方面设计得更好,所以也许它在那里工作得更好。

使用 ON CONFLICT 更新了答案,如下所述: Insert, on duplicate update in PostgreSQL?