由於 DELETE 語法的限制,在 PostgreSQL 中透過排序刪除行可能是一個挑戰。由於缺少主鍵,這個問題變得更加複雜,使得子查詢解決方案變得不切實際。
為了解決這個挑戰,您可以利用 ctid 字段,它是表中每一行的唯一識別碼。透過利用 ctid,您可以根據排序條件建構一個針對特定行進行刪除的查詢:
DELETE FROM ONLY logtable WHERE ctid IN ( SELECT ctid FROM logtable ORDER BY timestamp LIMIT 10 );
ctid 欄位為每個行版本提供唯一識別碼。但是,需要注意的是,如果行被 VACUUM FULL 更新或移動,它可能會改變。此外,如果日誌表具有繼承表,則 DELETE FROM ONLY 子句可防止從後代表中意外刪除行。
如果日誌表已分割區,則有必要在查詢中包含tableoid 以確保刪除僅發生在預期的分割區:
DELETE FROM logtable WHERE (tableoid,ctid) IN ( SELECT tableoid,ctid FROM logtable ORDER BY timestamp LIMIT 10 );
使用這些技術,您可以根據排序標準有效地刪除固定數量的行,同時保留精確刪除,確保刪除指定數量的行,無論重複的時間戳記為何。
以上是如何在沒有主鍵的情況下刪除 PostgreSQL 中特定數量的已排序行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!