我在Postgresql 9.1.3中使用以下命令将数据从临时登台表移动到Web应用程序(地理服务器)中正在使用的表中,所有这些都位于同一数据库中。然后删除临时表。

  • TRUNCATE table_foo;
  • INSERT INTO table_foo

    SELECT * FROM table_temp;
  • DROP TABLE table_temp;

  • 我想将其包装在事务中以允许并发。数据集小于2000行,并且截断比删除快。
  • 在事务中运行这些命令的最佳方法是什么?
  • 建议在CTE中创建函数还是编写UPSERT/MERGE等?
  • 最好删除所有行然后从temp表中批量插入而不是TRUNCATE?
  • 在postgres中可以回滚TRUNCATE或DELETE吗?
  • 临时表每天通过arcpy脚本中的ETL交付,我如何在postgres中自动化截断/删除/批量插入部分?
  • 我愿意使用PL/pgsql,PL/python(或为postgres推荐的py)

  • 目前,在将临时登台表导入数据库后,我正在手动执行sql命令。

    最佳答案

    truncatedelete都可以回滚(在手册中有明确记录)。

    由于其性质,truncate在可见性方面有些奇怪。

    有关详细信息,请参见手册:http://www.postgresql.org/docs/current/static/sql-truncate.html(底部的警告)

    如果您的应用程序在此过程中可以接受table_foo为“空”的事实,则截断可能更好(再次参见手册中的大红色框以获取解释)。如果您不想让应用程序注意到,则需要使用delete
    要在事务中运行这些语句,只需将它们放入一个即可:

    begin transaction;
    delete from table_foo;
    insert into ....
    drop table_temp;
    commit;
    

    是否在功能中执行此操作取决于您。
    truncate/insert将比delete/insert更快(因为它使生成的WAL数量最少)。

    关于postgresql - 在事务: truncate vs delete or upsert/merge中包装postgresql命令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13580741/

    10-13 04:31