Préserver le nombre de suppressions de lignes dans PostgreSQL sans tri ni clé primaire
Dans PostgreSQL, l'impossibilité de combiner l'ordre ou la limite avec la syntaxe de suppression pose un défi lorsque l'on tente de supprimer un nombre spécifique de lignes tout en préservant l'ordre dans lequel elles sont sélectionnées. Ceci est encore compliqué par l'absence de clé primaire dans la table.
Solution : utiliser le ctid
Pour contourner ces limitations, nous pouvons exploiter le ctid (Current Tuple Identifier) des lignes :
DELETE FROM ONLY logtable WHERE ctid IN ( SELECT ctid FROM logtable ORDER BY timestamp LIMIT 10 );
Le ctid fournit un identifiant unique pour chaque version de ligne au sein de sa table. En sélectionnant les ctids des 10 premières lignes triées par horodatage et en les utilisant dans l'instruction DELETE, nous pouvons supprimer efficacement le nombre de lignes souhaité, même si toutes les valeurs d'horodatage sont les mêmes.
Considérez partitionné Tables
Si la table de journalisation est partitionnée, nous devons tenir compte de la possibilité de plusieurs partitions contenant des lignes avec le même horodatage. Pour éviter de supprimer trop de lignes, nous pouvons inclure le tableoïde (identifiant de table) dans la requête :
DELETE FROM logtable WHERE (tableoid,ctid) IN ( SELECT tableoid,ctid FROM logtable ORDER BY timestamp LIMIT 10 );
Cela garantit que la suppression est limitée au nombre spécifié de lignes dans chaque partition.
En utilisant le ctid et le tableoid, nous pouvons implémenter la fonctionnalité souhaitée de suppression d'un nombre fixe de lignes avec tri dans PostgreSQL, même en l'absence de ligne principale. clé.
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!