我有以下表架构:
CREATE TABLE table (
pk1 bigint,
pk2 bigint,
some_text varchar(4),
valid_until bigint,
PRIMARY KEY (pk1, pk2)
我想在此表中插入一条记录,以防发生冲突,valid_until
列的最终值是旧值和新值的最大值。
有没有可能实现?如果是 - 是否有可能以框架友好的方式进行(我正在使用 Scala Quill)?
我有以下表架构:
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?