Supprimer des lignes avec tri peut être un défi dans PostgreSQL en raison de ses limitations dans la syntaxe DELETE. Ce problème est encore aggravé par l'absence de clé primaire, ce qui rend les solutions de sous-requête peu pratiques.
Pour relever ce défi, vous pouvez utiliser le champ ctid, un identifiant unique pour chaque ligne d'une table. En tirant parti du ctid, vous pouvez créer une requête qui cible des lignes spécifiques à supprimer en fonction de critères de tri :
DELETE FROM ONLY logtable WHERE ctid IN ( SELECT ctid FROM logtable ORDER BY timestamp LIMIT 10 );
Le champ ctid fournit un identifiant unique pour chaque version de ligne. Cependant, il est essentiel de noter que cela peut changer si la ligne est mise à jour ou déplacée par VACUUM FULL. De plus, si la table de journalisation a hérité de tables, la clause DELETE FROM ONLY empêche la suppression accidentelle de lignes des tables descendantes.
Dans le cas où la table de journalisation est partitionnée, il est nécessaire d'inclure le tableoïde dans la requête pour garantir que la suppression se produit uniquement dans les partitions prévues :
DELETE FROM logtable WHERE (tableoid,ctid) IN ( SELECT tableoid,ctid FROM logtable ORDER BY timestamp LIMIT 10 );
Grâce à ces techniques, vous pouvez supprimer efficacement un nombre fixe de lignes en fonction de critères de tri, tout en préservant la comportement de suppression exacte, garantissant que le nombre spécifié de lignes est supprimé quels que soient les horodatages en double.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!