代码之家  ›  专栏  ›  技术社区  ›  the_darkside

截断Postgres表的一部分

  •  0
  • the_darkside  · 技术社区  · 6 年前

    我正在运行Postgres版本10.01

    psql -V
    psql (PostgreSQL) 10.5
    

    我有一张桌子 mytable 大约有2.5亿行-我的目标是创建一个新表 newtable 复制大约一半 空白表 进入之内 新表 ( SELECT * WHERE time > '2019-01-01 ,然后删除我复制的记录 空白表

    当然,我想保留所有的索引 空白表

    最有效的命令是什么 psql ? TRUNCATE TABLE 是有效的,但将删除所有行。 DELETE 可能需要花费大量的时间来防止插入(每10分钟安排一次插入)

    有什么建议会有帮助的

    2 回复  |  直到 6 年前
        1
  •  1
  •   GMB    6 年前

    您需要分两步进行。

    首先,将行复制到新表中。可以使用create..as select语句(但之后需要在新表上手动重新创建索引和其他对象,如约束)。

    CREATE TABLE  new_table
    AS SELECT * FROM old_table WHERE time > '2019-01-01
    

    然后,从旧表中删除记录。看起来一种有效的方法是使用delete…使用语法与新表联接。假设您有一个名为id的主键:

    DELETE FROM old_table o
    USING new_table n
    WHERE n.id = o.id
    

    (在运行此命令之前,请确保在新表中对ID创建一个指示符)。

        2
  •  0
  •   jkramer    6 年前

    如果你只是想删除行,你就不能把你的删除当作一个事务来处理。除非您的插入依赖于表中的现有数据,否则不应该存在阻塞。