首頁 >資料庫 >mysql教程 >如何在沒有主鍵的情況下刪除 PostgreSQL 中特定數量的有序行?

如何在沒有主鍵的情況下刪除 PostgreSQL 中特定數量的有序行?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-05 07:42:42328瀏覽

How to Delete a Specific Number of Ordered Rows in PostgreSQL Without a Primary Key?

在PostgreSQL 中保留行刪除計數而不進行排序和主鍵

在PostgreSQL 中,無法將排序或限制與刪除語法結合起來當嘗試刪除特定數量的行同時保留它們的選擇順序時,這是一個挑戰。由於表中缺少主鍵,情況變得更加複雜。

解決方案:利用ctid

為了規避這些限制,我們可以利用ctid(目前行的元組識別碼):

DELETE FROM ONLY logtable
WHERE ctid IN (
    SELECT ctid
    FROM logtable
    ORDER BY timestamp
    LIMIT 10
);

ctid 為每行提供唯一識別碼其表中的版本。透過選擇按時間戳排序的前 10 行的 ctid 並在 DELETE 語句中使用它們,我們可以有效地刪除所需數量的行,即使所有時間戳值都相同。

考慮分區表

如果日誌表已分區,我們需要考慮多個分區包含具有相同時間戳的行的可能性。為了防止刪除太多行,我們可以在查詢中包含 tableoid(表標識符):

DELETE FROM logtable
WHERE (tableoid,ctid) IN (
    SELECT tableoid,ctid
    FROM logtable
    ORDER BY timestamp
    LIMIT 10
);

這可確保刪除僅限於每個分割區內指定的行數。

利用 ctid 和 tableoid,即使沒有主鍵,我們也可以在 PostgreSQL 中實現刪除固定數量的排序行的功能。

以上是如何在沒有主鍵的情況下刪除 PostgreSQL 中特定數量的有序行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn