我正在尝试将一些旧的MySQL查询移植到PostgreSQL,但我遇到了这个问题:
DELETE FROM logtable ORDER BY timestamp LIMIT 10;
PostgreSQL没有主键,所以我不能使用子查询 . 另外,我想保留查询删除给定数字或记录的行为 - 例如,如果表包含30行但它们都具有相同的时间戳,我仍然想要删除10,尽管没关系哪10 .
所以;如何在PostgreSQL中通过排序删除固定数量的行?
编辑:没有主键意味着没有 log_id
列或类似 . 啊,遗留系统的乐趣!
6 回答
您可以尝试使用ctid:
ctid
是:还有
oid
但只有在创建表时特别要求它才存在 .Postgres文档建议使用数组而不是IN和子查询 . 这应该更快
这个和其他一些技巧可以找到here
假设您要删除任何10条记录(没有订购),您可以这样做:
对于我的用例,删除10M记录,结果更快 .
您可以编写一个循环删除单个行的过程,该过程可以使用参数来指定要删除的项目数 . 但与MySQL相比,这有点过分 .
如果您没有主键,则可以使用数组Where IN语法和复合键 .
这对我有用 .