我有以下表格模式:
CREATE TABLE table (
pk1 bigint,
pk2 bigint,
some_text varchar(4),
valid_until bigint,
PRIMARY KEY (pk1, pk2)
我要在表中插入一条记录,以便在发生冲突的情况下,valid_until
列的最终值是旧值和新值的最大值。
有可能实现吗?如果是,是否可以做到框架友好(我正在使用Scala Quill)?
答案 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?