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?
我有以下 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?