Я использую базу данных Postgresql. У меня есть данные в двух таблицах. В таблице A 10 записей, а в таблице B 5 записей.
Я хотел бы скопировать данные таблицы A в таблицу B, но скопировать только новые записи (5 записей) и игнорировать дубликаты/уже существующие данные
Я хотел бы скопировать данные из таблицы A в таблицу B, где таблица B будет иметь 10 записей (5 старых записей + 5 новых записей из таблицы A)
Не могли бы вы помочь мне, как это можно сделать?
Предполагая, что id является вашим первичным ключом, а структуры таблиц идентичны (обе таблицы имеют общие столбцы в виде количества столбцов и типа данных соответственно), используйте not exists
:
insert into TableB
select *
from TableA a
where not exists ( select 0 from TableB b where b.id = a.id )
Является ли Select 0
преднамеренным или должно быть select *
просто стиль, который я предпочитаю :) (что бы вы ни заменили, включая звездочку) на not exists
, а select 1 ..
на exists
@gouravkr
Спасибо за ответ
Если вы хотите скопировать строки, уникальные для A, которых нет в B, вы можете использовать INSERT...SELECT. Оператор SELECT должен использовать оператор объединения, ЗА ИСКЛЮЧЕНИЕМ:
INSERT INTO B (column)
SELECT column FROM A
EXCEPT
SELECT column FROM B;
EXCEPT (https://www.postgresql.org/docs/current/queries-union.html) сравнивает два набора результатов и возвращает отдельные строки, присутствующие в результате A, но не в B, а затем передает эти значения в INSERT. Чтобы это работало, столбцы и соответствующие типы данных должны совпадать как в запросах SELECT, так и в вашем INSERT.
INSERT INTO Table_A
SELECT *
FROM Table_B
ON CONFLICT DO NOTHING
Здесь конфликт будет приниматься на основе вашего первичного ключа.
Если вы обновите свою устаревшую версию Postgres, вы можете использовать
INSERT ... ON CONFLICT DO NOTHING