在沒有主鍵的情況下保留PostgreSQL 中的行刪除順序
在MySQL 中,查詢DELETE FROM logtable ORDER BY timest LIMDER ;毫不費力地從表中刪除指定數量的行,同時保持排序順序。然而,PostgreSQL 透過在其刪除語法中禁止排序或限制來提出挑戰,特別是當表缺少主鍵時。
克服主鍵約束
規避針對這個障礙,PostgreSQL 提供了一個利用 ctid 的解決方案。 ctid 表示表中每行的物理位置。雖然它不是永久標識符,但它在每個表中的唯一性使其成為行刪除的可行替代方案。
利用ctid
可以利用ctid 來刪除預定的行使用以下查詢的排序行數:
DELETE FROM ONLY logtable WHERE ctid IN ( SELECT ctid FROM logtable ORDER BY timestamp LIMIT 10 );
DELETE FROM ONLY 限制刪除操作到指定的表,防止意外刪除繼承的表。
處理分割區和安全設定
如果日誌表已分割,則必須包含 tableoid(資料表 ID)在查詢中防止多個分割區發生刪除。
此外,如果實施了安全策略,您可以需要調整查詢以確保適當的存取權限。
附加說明
重要的是要記住,當透過 VACUUM FULL 更新或移動行時,ctid 可能會更改。如果您打算使用 ctid 作為長期行標識符,請記住此限制。
以上是如何在沒有主鍵的情況下以特定順序刪除 PostgreSQL 中的行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!