bogdan_uman
@bogdan_uman
шлЫмазл неукЪ-поцЪ

Добавление и обновление записей через Insert Into?

Здравствуйте. Вопрос к знатокам, как в плане производительности и правильности. Есть например есть таблица
ROLLBACK;
BEGIN;
CREATE TEMP TABLE test( id integer, number varchar(12), other varchar(10)) ON COMMIT DROP;
CREATE UNIQUE INDEX ON test( number );
insert into test values ( 1, '1', '');
select * from test;
commit;


Например идет вставка по уникальному номеру (поле number)
1) Сначала ищем есть ли записи
select * from test where number = '1';
и если запрос ничего не вернул вставляем запись
insert into test values ( '1', '');
если вернул, тогда обновляем записи
update test set other = 'ttt' where number = '1';

2) Или лучше все сделать одним запросом
insert into test values ( '1', 'tttt') ON CONFLICT (number) DO update SET other = EXCLUDED.other;


Мне больше нравиться конечно второй вариант: меньше кода + меньше обращений к таблицам + проще обслуживать, но насколько его можно использовать в больших проектах? Спасибо
  • Вопрос задан
  • 172 просмотра
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
С insert или update по результату select (к слову, совершенно ненужному запросу) вы вляпываетесь в race condition
on conflict специально сделан для нормальной сериализации происходящего и использоваться и должен. Другие способы сериализации race condition из времён до on conflict производительность просаживают по вполне очевидным причинам.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы