从表中删除所有数据,但最后 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 从表中选择条目,其中属性等于参数,否则选择 * 条目
MySQL 查询从表中检索数据和第二个查询以提取其他结果,没有重复