我在postgresql 9.1.3中使用以下命令将数据从临时临时表移动到同一数据库中的webapp(geoserver)中使用的表。然后放下临时表。
TRUNCATE table_foo;
INSERT INTO table_foo
SELECT * FROM table_temp;
DROP TABLE table_temp;
我想在事务中包装它以允许并发。数据集小于2000行,截断比删除快。
目前,我将temp临时表导入到我的数据库后手动执行sql命令。
答案 0 :(得分:3)
truncate
和delete
都可以回滚(手册中已明确记录)。
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数量。