Postgres:在ON CONFLICT中使用MAX

时间:2019-07-08 16:01:08

标签: postgresql scala quill.io

我有以下表格模式:

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

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

有可能实现吗?如果是,是否可以做到框架友好(我正在使用Scala Quill)?

1 个答案:

答案 0 :(得分:1)

至少可以通过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中以某种方式模仿它。通常,我实际上是在尝试避免尝试使framworks与数据库巧妙结合,它几乎总是最终再次成为Hibernate陷阱,在这种情况下,为避免SQL而进行的搜索不仅要付出更多的代价。不过,也许Scala的framworks更好一些,至少Scala在设计此类framworks方面设计得更好,所以也许在那里效果更好。

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