Только добавление неповторяющихся значений в таблицу PostgreSQL - PullRequest
3 голосов
/ 06 мая 2020

Мне интересно, как лучше всего избежать дублирования внутри таблицы PostgreSQL базы данных. Строки в таблице эквивалентны записям из стороннего API, который вызывается несколько раз в течение дня.

Я только добавляю записи, которые не дублируются из ответа JSON. Ответ JSON может содержать более 500 объектов в базе данных, скажем:

[{
  "unique_id": 1234,
  "name": "A",
  "wins": 1
},
{
  "unique_id": 1235
  "name": "B",
  "wins": 1
}, 
... 
];

Проблема в том, что данные из API могут быть данными, которые я уже сохранил в базы данных, и когда я снова запрашиваю стороннюю конечную точку, я не хочу, чтобы данные, которые уже были вставлены, снова добавлялись - только уникальные объекты в результате.

И я знаю Как я могу проверить, существует ли один отдельный объект в виде строки, но когда у меня в ответе третьей стороны содержится более 500 и только 50 из них будут уникальными, что будет разумной проверкой для этого в одной транзакции базы данных?

У меня возникло искушение использовать go до SELECT * FROM table_name, добавить эти результаты в ответ json, а затем удалить дубликаты таким образом, но это похоже на очень много накладных расходов.

Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Установите ограничение UNIQUE для столбца, который должен быть уникальным, а затем вставьте его с ON CONFLICT DO NOTHING (или ON CONFLICT DO UPDATE, если вы не знали, что это вариант, но это то, что вы действительно хотите сделать).

1 голос
/ 06 мая 2020

Простой способ продолжить - объявить уникальное ограничение (или уникальный индекс, или первичный ключ), которое ссылается на соответствующие столбцы в таблице. Вы можете использовать предложение on conflict do nothing в своих запросах insert:

Пример:

create table mytable(unique_id int, name text, wins int);
create unique index myidx on mytable(unique_id, name, wins);

insert into mytable (unique_id, name, wins) 
values(1234, 'A', 1)
on conflict(unique_id, name, wins) do nothing;
...