Postgresql

沒有使用此 WHERE NOT EXISTS 表達式插入數據?

  • May 24, 2018

我想將數據從 MySQL 移動到 PostgreSQL。我正在使用 mysql.connector 和 psycopg2 來查詢這兩個數據庫。當我WHERE NOT EXISTS為我的 PostgreSQL 數據庫執行時,它不會插入來自 MySQL 的數據。

主題表沒有唯一的列,所以我使用WHERE NOT EXISTS而不是ON CONFLICT.

curr_msql.execute('''SELECT scode, sname sunits FROM subject_table''')

for row in curr_msql:
           curr_pgsql.execute('''INSERT INTO subject (created, modified, code, name, units)
           SELECT current_timestamp, current_timestamp, %s, %s, %s
           WHERE NOT EXISTS(SELECT code FROM subject WHERE code = code)
           ''', (row['scode'], row['sname'], row['sunits']))

執行查詢時我沒有收到任何錯誤,但沒有插入數據。

您的條件將列值與自身進行比較:

WHERE NOT EXISTS(SELECT code FROM subject WHERE code = code)

歸結為:

WHERE NOT EXISTS(SELECT FROM subject WHERE code IS NOT NULL)

IOW,只要表中 true一行帶有code IS NOT NULL. 我不認為這是故意的。

猜猜你想要類似的東西:

'''INSERT INTO subject (created, modified, code, name, units)
  SELECT current_timestamp, current_timestamp, %s, %s, %s
  WHERE NOT EXISTS(SELECT code FROM subject WHERE code = **%s**)'''
, (row['scode'], row['sname'], row['sunits'], **row['scode']**))

這不適合併發寫入負載。我建議盡可能創建缺失的UNIQUE約束(code)並使用INSERT .. ON CONFLICT ... DO NOTHINGcode如果表很大,無論如何你都需要一個索引來提高性能。

引用自:https://dba.stackexchange.com/questions/207683