Das Löschen von Zeilen mit Sortierung kann in PostgreSQL aufgrund der Einschränkungen in der DELETE-Syntax eine Herausforderung darstellen. Dieses Problem wird durch das Fehlen eines Primärschlüssels noch verschärft, was Unterabfragelösungen unpraktisch macht.
Um dieser Herausforderung zu begegnen, können Sie das ctid-Feld verwenden, eine eindeutige Kennung für jede Zeile innerhalb einer Tabelle. Durch die Nutzung der ctid können Sie eine Abfrage erstellen, die auf der Grundlage von Sortierkriterien auf bestimmte zu löschende Zeilen abzielt:
DELETE FROM ONLY logtable WHERE ctid IN ( SELECT ctid FROM logtable ORDER BY timestamp LIMIT 10 );
Das ctid-Feld stellt eine eindeutige Kennung für jede Zeilenversion bereit. Es ist jedoch wichtig zu beachten, dass es sich ändern kann, wenn die Zeile durch VACUUM FULL aktualisiert oder verschoben wird. Wenn die Protokolltabelle außerdem über geerbte Tabellen verfügt, verhindert die DELETE FROM ONLY-Klausel das versehentliche Löschen von Zeilen aus untergeordneten Tabellen.
Falls die Protokolltabelle partitioniert ist, muss Tableoid in die Abfrage einbezogen werden, um sicherzustellen, dass das Löschen nur übergreifend erfolgt die beabsichtigten Partitionen:
DELETE FROM logtable WHERE (tableoid,ctid) IN ( SELECT tableoid,ctid FROM logtable ORDER BY timestamp LIMIT 10 );
Mit diesen Techniken können Sie effektiv eine feste Anzahl von Zeilen basierend auf Sortierkriterien löschen. Unter Beibehaltung des Verhaltens des exakten Löschens wird sichergestellt, dass die angegebene Anzahl von Zeilen unabhängig von doppelten Zeitstempeln entfernt wird.
Das obige ist der detaillierte Inhalt vonWie lösche ich eine bestimmte Anzahl sortierter Zeilen in PostgreSQL ohne Primärschlüssel?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!