从表中删除所有数据,但最后 N 个条目

Posted

技术标签:

【中文标题】从表中删除所有数据,但最后 N 个条目【英文标题】:Remove all data from table but last N entries 【发布时间】:2013-04-01 03:24:11 【问题描述】:

我正在将 psycopg2 与 Python 一起使用。

我想定期刷新数据库中的数据。我为此设置了Timer 的任务。我之前问过this question,但使用那里列出的答案会冻结我的机器(键盘停止响应,整个系统停止运行)。相反,我想删除表中的所有条目,尽管最后一个 N (也不确定这是否是正确的方法)。

基本上,还有另一个 python 进程正在运行(单独的可执行文件),它正在填充我希望询问的数据库。似乎如果我删除所有条目,并且其他进程正在运行,它可能会导致冻结。我不知道删除条目的安全方法;就好像另一个进程在写入数据库时​​依赖于递增的 ID。

如果有人能帮我解决这个问题,我们将不胜感激。想法?

【问题讨论】:

【参考方案1】:

一个可能的解决方案是在所有 id 上运行 DELETE,除了 select ... order by pk desc limit N 返回的那些,给定一个自动增量 pk。如果不存在这样的 pk,则拥有 created_date 并按其排序也应该这样做。

未测试示例:

import psycopg2
connection = psycopg2.connect('dbname=test user=postgres')
cursor = conn.cursor()

query = 'delete from my_table where id not in (
            select id from my_table order by id desc limit 30)'
cursor.execute(query)
cursor.commit() #Don't know if necessary
cursor.close()
connection.close()

【讨论】:

谢谢。可以举个例子吗? 你多久调用一次 cursor.close()? 你只需要执行一个查询,所以我猜只有一次。 实际上,代码是基于任务运行的,任务在 Timer 上每隔 1-3 秒发生一次。我可以让系统运行任务大约 3 次,然后我的机器就死机了。我认为传播数据的过程(也是python)正在寻找插入一个现在不存在的ID,因为我们已经删除了它。可能吗? 我发现我没有提交,这导致两个程序之间断开连接。【参考方案2】:

这可能要快得多:

CRETE TEMP TABLE tbl_tmp AS
SELECT * FROM tbl ORDER BY <undisclosed> LIMIT <N>;

TRUNCATE TABLE tbl;
INSERT INTO tbl SELECT * FROM tbl_tmp;

一个会话中完成所有操作。具体情况取决于您未披露的其他情况。

比较这个相关的综合答案(您的情况更简单):Remove duplicates from table based on multiple criteria and persist to other table

【讨论】:

以上是关于从表中删除所有数据,但最后 N 个条目的主要内容,如果未能解决你的问题,请参考以下文章

SQL 从表中选择条目,其中属性等于参数,否则选择 * 条目

从 postgres 数据库中删除重复条目

MySQL 查询从表中检索数据和第二个查询以提取其他结果,没有重复

删除不同表中的条目 MySQL 查询

在 rails upgrade 迁移条目从模式迁移表中删除后

如何使用 LINQ 从表中获取最新条目?