PostgreSQL では、DELETE 構文の制限のため、ソートによる行の削除が困難になる場合があります。この問題は、主キーがないことでさらに悪化し、サブクエリ ソリューションが実用的ではなくなります。
この課題に対処するには、テーブル内の各行の一意の識別子である 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 中国語 Web サイトの他の関連記事を参照してください。