Postgres вставляет в таблицу только новые строки

#python #sql #postgresql

Вопрос:

У меня есть такой код,

   cursor_local.execute("""SELECT "Name", "Level_Capacity", "Source_NE", "Sink_NE" FROM "table1" WHERE "Name" LIKE '%WDM%' """)
  rows = cursor_local.fetchall()

  psycopg2.extras.execute_batch(cursor_local, 'INSERT INTO table2("Name", "Level_Capacity", "Source_NE", "Sink_NE") VALUES (%s, %s, %s, %s)', (*rows,) )
  connection_local.commit()
 

и я хотел бы вставить в таблицу 2 только новые записи из таблицы 1 (база данных postgres), только те, которых нет в таблице 2.
В таблице 2 «Идентификатор» генерируется автоматически и уникален (другие не уникальны) , при вставке я хотел бы проверить, существует ли «Имя», «Source_NE», «Sink_NE».

Ответ №1:

является ли «имя» уникальным? может быть, вы можете сделать имя КОНФЛИКТА «НИЧЕГО НЕ ДЕЛАЙ»

 INSERT INTO table2
VALUES ,,,
ON CONFLICT 'Name' DO NOTHING;
 

иначе вы могли бы сделать НЕ В (ВЫБЕРИТЕ «Имя» и т. Д. Из таблицы2) и т. Д.

 INSERT INTO table2
VALUES (
    SELECT * FROM table1 WHERE ('Name' etc)
    NOT IN (SELECT 'Name', etc FROM table2)
    )
 

Ответ №2:

это работает:

 INSERT INTO "table2" ("Name", "Level_Capacity", "Source_NE", "Sink_NE")
SELECT "Name", "Level_Capacity", "Source_NE", "Sink_NE"
FROM "table1" WHERE ("Name", "Source_NE", "Source_Port", "Sink_NE", "Sink_Port") NOT IN (SELECT "Name", "Source_NE", "Source_Port", "Sink_NE", "Sink_Port" FROM "table2");
 

Спасибо