ホームページ >データベース >mysql チュートリアル >主キーを使用せずに PostgreSQL で特定の数の順序付けされた行を削除するにはどうすればよいですか?

主キーを使用せずに PostgreSQL で特定の数の順序付けされた行を削除するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-05 07:42:42331ブラウズ

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

並べ替えと主キーを使用せずに PostgreSQL で行削除数を保持する

PostgreSQL では、順序付けや制限と削除構文を組み合わせられないことが問題となります。選択された順序を維持しながら特定の数の行を削除しようとする場合の課題。これは、テーブルに主キーがないためさらに複雑になります。

解決策: ctid の利用

これらの制限を回避するには、ctid (Current行のタプル識別子):

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。