Postgresql
沒有使用此 WHERE NOT EXISTS 表達式插入數據?
我想將數據從 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 NOTHING
。code
如果表很大,無論如何你都需要一個索引來提高性能。