“Insert into select from”Postgres 查询期间潜在的数据丢失

问题描述 投票:0回答:1

我在 PostgreSQL 中有一个临时表,并使用一个简单的

INSERT INTO ... SELECT ...
查询将数据从临时表复制到最终表。但是,我偶尔会遇到操作完成后数据丢失的问题。我不知道为什么会发生这种情况。我已经检查了暂存表的正确性(数据正确)

以下是一些值得注意的细节:

  • 临时表是一个简单的表,没有任何索引或键。
  • 最终表有键和索引。
  • 该问题并非始终出现。有时数据传输工作正常,但有时会出现数据丢失。

我正在使用的代码

import pg8000

...
bigSql = f"INSERT INTO final_tbl({sqlCols}) SELECT {sqlCols} FROM staging_tbl"
print(' ->Inserting data...')
limit = 4000000
offset = 0
while True:
    cursor.execute(bigSql+f" LIMIT {limit} OFFSET {offset}")
    print('Inserted ', cursor.rowcount)
    if cursor.rowcount==0:
        break
    offset += limit
connection.commit()

关于服务器信息,我正在使用azure vm和laravel forge面板提供的postgressql。

python database postgresql bulkinsert pg8000
1个回答
0
投票

使用这种方法,至少,您需要一个

ORDER BY
子句 - 否则,不同的查询调用不能保证以相同的顺序返回结果,并且您的
LIMIT … OFFSET …
可能会选择一些重复的行并错过其他行完全。

如果您有并发写入流量,您还需要处理它。

此外,如果您在没有具体原因的情况下决定采用此

LIMIT
解决方案,请考虑仅使用一个没有
LIMIT
OFFSET
的查询。在一个事务中进行大量插入不一定需要担心 - 例如,它不会阻止对表的并发读取或写入。

© www.soinside.com 2019 - 2024. All rights reserved.