Копировать данные из одной таблицы в другую — игнорировать дубликаты Postgresql

Я использую базу данных Postgresql. У меня есть данные в двух таблицах. В таблице A 10 записей, а в таблице B 5 записей.

Я хотел бы скопировать данные таблицы A в таблицу B, но скопировать только новые записи (5 записей) и игнорировать дубликаты/уже существующие данные

Я хотел бы скопировать данные из таблицы A в таблицу B, где таблица B будет иметь 10 записей (5 старых записей + 5 новых записей из таблицы A)

Не могли бы вы помочь мне, как это можно сделать?

Если вы обновите свою устаревшую версию Postgres, вы можете использовать INSERT ... ON CONFLICT DO NOTHING

a_horse_with_no_name 27.05.2019 16:52
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
1 317
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Предполагая, что 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 *

gouravkr 24.01.2020 13:30

просто стиль, который я предпочитаю :) (что бы вы ни заменили, включая звездочку) на not exists, а select 1 .. на exists @gouravkr

Barbaros Özhan 24.01.2020 14:42

Спасибо за ответ

The Great 28.07.2020 02:46

Если вы хотите скопировать строки, уникальные для 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

Здесь конфликт будет приниматься на основе вашего первичного ключа.

Другие вопросы по теме