【问题标题】:psql - how to flush database content without dropping tablepsql - 如何在不删除表的情况下刷新数据库内容
【发布时间】:2013-03-29 22:14:11
【问题描述】:

我的数据库中有一个名为“mytable”的表。我想清除它,以便我可以继续从中收集和分析“新数据”。

有点像

conn = psycopg2.connect(database = mydb_name, host = mydb_server, user = mydb_uname, password = mydb_pwd)
cur = conn.cursor()
cur.execute("DROP TABLE mytable;")

对我不起作用,因为据我了解,这会破坏桌子。我不想破坏/重新创建......只是为了刷新所有数据。

我该如何解决这个问题?

【问题讨论】:

    标签: python psycopg2 postgresql-9.2 psql


    【解决方案1】:
     Truncate tablename
    

    对此很有用,表格只是删除数据!

    如果你有外键,你需要使用以下

     Truncate tablename CASCADE
    

    很多表都这样

     Truncate table1, table2, table3
    

    你的例子

     Cur.execute("truncate mytable;")
    

    【讨论】:

    • 如何避免枚举所有表名,而只截断所有表中的所有数据? DELETE * FROM *; ?或者TRUNCATE *
    • 这段代码冻结了我的机器,因为有一个并发的 python 可执行文件正在传播数据库。你能建议一个替代方案吗?您认为这可能是因为传播代码库依赖于 ID 吗?
    【解决方案2】:

    这个 sql 查询应该从表中删除所有记录...

    DELETE FROM mytable; // not DELETE * FROM mytable;
    

    【讨论】:

    • 如文档中所述:TRUNCATE 快速从一组表中删除所有行。它与每个表上的非限定 DELETE 具有相同的效果,但由于它实际上并不扫描表,因此速度更快。此外,它会立即回收磁盘空间,而不需要后续的 VACUUM 操作。这在大表上最有用。但如果您处于并发上下文中,则 DELETE 会更安全。
    猜你喜欢
    • 2011-02-01
    • 2011-11-20
    • 2012-11-01
    • 2011-02-23
    • 2017-12-02
    • 2019-12-30
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多