Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как будет выглядеть UPSERT / 3 сообщений из 3, страница 1 из 1
17.01.2021, 14:43
    #40036553
Wasteland Rebel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет выглядеть UPSERT
Я абсолютно не дружу с БД, но появилась такая необходимость.
Есть таблица в БД с такой структурой:
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE web.account_view (
	account_login text NOT NULL,
	account_view_id text NOT NULL,
	CONSTRAINT account_view_account_view_id_key UNIQUE (account_view_id),
	CONSTRAINT account_view_ids_pkey PRIMARY KEY (account_login, account_view_id),
	CONSTRAINT gaccount_view_ids_account_login_fkey FOREIGN KEY (account_login) REFERENCES web.google_account(login)
);


На вход для сохранения в БД приходит такой JSON с набором view_id и account_login:
Код: sql
1.
2.
3.
4.
   {
      "account_view_id":"190",
      "account_login":"email1@gmail.com"
   }


Но при сохранении обычным INSERT некоторых JSON возникает ошибка:
Код: sql
1.
ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности "account_view_account_view_id_new_key" Detail: Ключ "(account_view_id)=(9082)" уже существует.



Как будет выглядеть скрипт для UPSERT (перезаписывать данные, если найден дубликат) в данном случае?
...
Рейтинг: 0 / 0
18.01.2021, 08:54
    #40036689
Master_Detail
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет выглядеть UPSERT
Проверьте наличие по ключу. Есть - update, нет - insert
...
Рейтинг: 0 / 0
18.01.2021, 11:31
    #40036735
DSKalugin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет выглядеть UPSERT
Wasteland Rebel,
Если есть уникальное ограничение на поле account_view_id
Код: sql
1.
	CONSTRAINT account_view_account_view_id_key UNIQUE (account_view_id),


то следующий первичный ключ уже не имеет смысла т.к. ограничивается первым. Возможно он лишний, надо знать задачу
Код: sql
1.
	CONSTRAINT account_view_ids_pkey PRIMARY KEY (account_login, account_view_id),



Обновление при конфликте вставки выглядит так
Код: sql
1.
2.
3.
4.
5.
INSERT INTO web.account_view (account_login, account_view_id )
values('email1@gmail.com', '190')
ON CONFLICT (account_view_account_view_id_key) 
DO UPDATE 
  SET account_login= EXCLUDED.account_login;


Подробности
https://postgrespro.ru/docs/postgresql/11/sql-insert
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как будет выглядеть UPSERT / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]