我正在尝试将一些旧的MySQL查询移植到PostgreSQL,但我遇到了这个问题:
DELETE FROM logtable ORDER BY timestamp LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
PostgreSQL不允许对其删除语法进行排序或限制,并且该表没有主键,因此我无法使用子查询.此外,我想保留在查询删除的行为究竟该规定数量的记录-例如,如果表中包含30行,但它们都具有相同的时间戳,我还是想删除10,虽然它并不重要哪10.
所以; 如何在PostgreSQL中通过排序删除固定数量的行?
编辑:没有主键意味着没有log_id
列或类似.啊,遗留系统的乐趣!
mu *_*ort 144
您可以尝试使用ctid
:
DELETE FROM logtable
WHERE ctid IN (
SELECT ctid
FROM logtable
ORDER BY timestamp
LIMIT 10
)
Run Code Online (Sandbox Code Playgroud)
该ctid
方法是:
行版本在其表中的物理位置.请注意,虽然
ctid
可以非常快速地定位行版本,但ctid
如果更新或移动行,则行将更改VACUUM FULL
.因此ctid
作为长期行标识符是无用的.
还有,oid
但只有在创建表时特别要求它才存在.
小智 43
Postgres文档建议使用数组而不是IN和子查询.这应该更快
DELETE FROM logtable
WHERE id = any (array(SELECT id FROM logtable ORDER BY timestamp LIMIT 10));
Run Code Online (Sandbox Code Playgroud)
这里和其他一些技巧可以在这里找到
Kon*_*rus 12
delete from logtable where log_id in (
select log_id from logtable order by timestamp limit 10);
Run Code Online (Sandbox Code Playgroud)
小智 5
如果没有主键,可以将数组Where IN 语法与组合键一起使用。
delete from table1 where (schema,id,lac,cid) in (select schema,id,lac,cid from table1 where lac = 0 limit 1000);
Run Code Online (Sandbox Code Playgroud)
这对我有用。