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

时间:2013-04-01 03:24:12

标签: python sql postgresql psycopg2 postgresql-9.2

我正在使用psycopg2和Python。

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

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

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

2 个答案:

答案 0 :(得分:2)

一种可能的解决方案是在所有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()

答案 1 :(得分:1)

这可能要快得多:

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