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;


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

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

Войти через центр авторизации
Похожие вопросы