Проблемы с добавлением / обновлением больших данных на PostgresSQL - PullRequest
0 голосов
/ 19 марта 2020

Я хочу добавить большие объемы данных в таблицу. Перед добавлением проверяю, есть ли данные в таблице или нет.

Я имею дело со следующим:

Пример:

Таблица users

id | name | address

.. | .... | .......

select id from users where id = ... and name = ...

if not exist

insert....

if exist

update ....

Моя проблема - слишком много времени. Интересно, у всех есть решение, чтобы решить эту проблему быстрее?

1 Ответ

3 голосов
/ 19 марта 2020

На самом деле вам не нужно выполнять эту проверку вручную. Это скорее работа ограничения, например, через первичный ключ.

Таблица с ограничением первичного ключа на основе id и name:

CREATE TABLE users (
id INT, name TEXT, address TEXT,
PRIMARY KEY (id,name));

Итак, если вы попытаетесь вставить две записи с одинаковыми id и name вы получите исключение - сообщение об ошибке ниже на немецком языке, но в основном оно говорит, что ограничение pk было нарушено:

INSERT INTO users VALUES (1,'foo','add 1');
INSERT INTO users VALUES (1,'foo','add 2');

FEHLER:  doppelter Schlüsselwert verletzt Unique-Constraint »users_pkey«
DETAIL:  Schlüssel »(id, name)=(1, foo)« existiert bereits.

В случае, если вы хотите обновить address, когда id и name уже существует, попробуйте использовать UPSERT:

INSERT INTO users VALUES (1,'foo','add x')
ON CONFLICT (id, name) 
DO UPDATE SET address = EXCLUDED.address;

Если вы хотите просто игнорировать конфликтующую вставку, не вызывая исключения, просто сделайте следующее:

INSERT INTO users VALUES (1,'foo','add x')
ON CONFLICT DO NOTHING;

См. это answer для получения более подробной информации.

Относительно скорости : вы должны скорее проверить, имеет ли ваша таблица правильный индекс, или даже если индекс вообще имеет смысл, когда выполняя вставку. Иногда лучше импортировать большой объем данных во временную UNLOGGED TABLE таблицу без индекса , а затем заполнять целевую таблицу SQL, удаляя дубликаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...