Вставьте в таблицу PostgreSQL, если уникальная комбинация столбцов не существует, и если она существует, обновите существующую запись

#sql #postgresql #upsert

#sql #postgresql #опрокинуть

Вопрос:

У меня есть таблица, структурированная столбцами user_id, item_id, test

Я хотел бы сделать запрос на ВСТАВКУ/ОБНОВЛЕНИЕ, чтобы, если комбинация user_id и item_id уже найдена в строке таблицы, она просто обновила тест этой строки. Я попробовал выполнить следующий запрос, но он не работает:

 INSERT INTO tableName (user_id, item_id, test)  VALUES($1, $2, $3)  ON CONFLICT ON CONSTRAINT UNIQUE(user_id, item_id)  DO UPDATE SET test = ($3)  

Это не работает. Я также пробовал поиграть с ОТДЕЛЬНЫМ ключевым словом, но мне не удалось заставить его работать правильно. Любая помощь очень ценится!

Ответ №1:

Вам нужен уникальный индекс для обоих столбцов. Это может быть составной первичный ключ или составное уникальное ограничение, например:

 create table tablename(  user_id int,   item_id int,   test text,  primary key (user_id, item_id) );  

Затем используйте простой правильный синтаксис:

 insert into tablename (user_id, item_id, test)  values(1, 1, '1')  on conflict (user_id, item_id)  do update set test = excluded.test