我正在尝试将一些旧的MySQL查询移植到PostgreSQL,但我在使用这个查询时遇到了问题:
DELETE FROM logtable ORDER BY timestamp LIMIT 10;
PostgreSQL在其delete语法中不允许排序或限制,并且表没有主键,所以我不能使用子查询。此外,我希望保留查询完全删除给定数字或记录的行为--例如,如果表包含30行,但它们都具有相同的时间戳,我仍然希望删除10行,尽管哪10行并不重要。
那么,如何在PostgreSQL中使用排序功能删除固定数量的行呢?
编辑:没有主键表示没有log_id
列或类似的列。啊,遗留系统的乐趣!
发布于 2011-03-03 01:16:54
Postgres文档建议使用数组而不是IN和subquery。这应该会快得多。
DELETE FROM logtable
WHERE id = any (array(SELECT id FROM logtable ORDER BY timestamp LIMIT 10));
这个技巧和其他一些技巧可以在here中找到
发布于 2011-03-03 01:06:56
delete from logtable where log_id in (
select log_id from logtable order by timestamp limit 10);
发布于 2013-12-18 20:18:09
假设您想要删除任何10条记录(没有排序),您可以这样做:
DELETE FROM logtable as t1 WHERE t1.ctid < (select t2.ctid from logtable as t2 where (Select count(*) from logtable t3 where t3.ctid < t2.ctid ) = 10 LIMIT 1);
在我的用例中,删除10M条记录会更快。
https://stackoverflow.com/questions/5170546
复制相似问题