【问题标题】:Postgres insert only new rows to the tablePostgres 只向表中插入新行
【发布时间】:2022-01-01 14:00:02
【问题描述】:

我有这样的代码,

  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()

我只想从 table1 (postgres db) 将新记录插入到 table2 中,只插入那些不在 table2 中的记录。 在table2中“Id”是自动生成的并且是唯一的(其他不是唯一的),插入时我想检查它是否存在“Name”、“Source_NE”、“Sink_NE”。

【问题讨论】:

    标签: python sql postgresql


    【解决方案1】:

    “名称”是唯一的吗?也许你可以做一个 ON CONFLICT Name DO NOTHING

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

    否则您可以执行 NOT IN (SELECT "Name" etc FROM table2) 等

    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");
      

      谢谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-13
        • 2014-10-16
        • 2021-09-06
        • 1970-01-01
        • 2017-08-23
        相关资源
        最近更新 更多