Как без предварительной проверки существования записи по первичному ключу, сразу вставлять ее, а при возникновения конфликта — просто обновить? И все за раз. Необходимо воспользоваться предложением on conflict … do …
Подробней об этом расскажет страница документации.
Я покажу пример, как при возникновении нарушения уникальности первичного ключа обновить данные.
[pastacode lang=»sql» manual=»insert%20into%20products%20values%20(111%2C%20’new%20product%20name’%2C%2010)%20%0Aon%20conflict%20on%20constraint%20products_pkey%20do%20update%20%0Aset%20product_name%20%3D%20’new%20product%20name’%2C%20amount_in_stock%20%3D%2010%3B» message=»» highlight=»» provider=»manual»/]
Где таблица products содержит следующие поля: product_id, product_name, amount_in_stock. products_pkey — ограничение первичного ключа. В итоге, если вставляется запись с уже имеющимся в таблице product_id = 111, она будет просто обновлена с указанными значениями.
Для обновления записи теми же значениями, что указываются в перечне values(), необходимо использовать обращение excluded:
[pastacode lang=»sql» manual=»insert%20into%20products%20values%20(111%2C%20’new%20product%20name’%2C%2010)%20%0Aon%20conflict%20on%20constraint%20products_pkey%20do%20update%20%0Aset%20product_name%20%3D%20excluded.product_name%2C%20amount_in_stock%20%3D%20excluded.amount_in_stock%3B» message=»» highlight=»» provider=»manual»/]