Postgres: используйте MAX в ON CONFLICT - PullRequest
0 голосов
/ 08 июля 2019

У меня есть следующая схема таблицы:

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

Я хочу вставить в эту таблицу запись таким образом, чтобы в случае конфликта окончательное значение столбца valid_until было максимальным из старого значенияи новый.

Возможно ли достичь?Если да - возможно ли сделать это дружественным к фреймворку способом (я использую Scala Quill)?

1 Ответ

1 голос
/ 08 июля 2019

По крайней мере это возможно сделать через 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, как описано здесь: Вставьте на дубликатеобновить в PostgreSQL?

...