1. ホーム
  2. sql

[解決済み] PostgreSQLでソートしながら固定数の行を削除するには?

2022-06-10 09:26:01

質問

古いMySQLのクエリをPostgreSQLに移植しようとしているのですが、このクエリで問題が発生しました。

DELETE FROM logtable ORDER BY timestamp LIMIT 10;

PostgreSQLは削除構文において順序や制限を許しません。 また、テーブルには主キーがありませんので、副問い合わせを使用することができません。さらに、私は、クエリが まさに たとえば、テーブルに 30 行が含まれ、それらがすべて同じタイムスタンプを持つ場合、どの 10 行かは重要ではありませんが、私はまだ 10 行を削除したいのです。

PostgreSQLでソートを使用して固定数の行を削除するにはどうすればよいのでしょうか?

編集してください。 主キーがないということは log_id カラムなどがないということです。ああ、レガシーシステムの楽しみだ!

どのように解決するか?

を使用してみてください。 ctid :

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

ctid

そのテーブル内の行バージョンの物理的な位置。なお ctid は行のバージョンを非常に素早く見つけるために使用できますが、行の ctid によって更新されたり移動されたりすると変更されます。 VACUUM FULL . したがって ctid は長期的な行の識別子としては役に立ちません。

また oid もありますが、これはテーブルを作成するときに特別に要求した場合のみ存在します。