На самом деле вам не нужно выполнять эту проверку вручную. Это скорее работа ограничения, например, через первичный ключ.
Таблица с ограничением первичного ключа на основе 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, удаляя дубликаты.