#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