PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 20/06/2011 00:28:29

ilrico
Membre

DELETE avec ORDER BY et LIMIT...

bonsoir,
j'ai une table qui se peuple d'un nombre élevé d'objets identiques. Leur unicité est importante car ils sont des sortes de jetons qui les utilisateurs de l'application capturent un à un.
pour les détruire j'aimerais avoir une requete du style (detruire les 50 plus récents par ex:)

DELETE FROM table WHERE creator_id = 5 ORDER BY time_creation DESC LIMIT 50;

ça ne marche pas ! (d'après mes recherches, sous MySQL cette syntaxe intuitive mais non conforme SQL fonctionne... je vais pas me faire des amis si je continue comme ça...)

ci-joint 2 liens que j'ai rapidement trouvé, qui me confirment que cela ne fonctionne pas :
http://archives.postgresql.org/pgsql-pa … g00255.php
http://drupal.org/node/510892

mais ils ne donnent pas de solution.

celle qui me vient en tête est de faire, un truc du genre (exemple en PHP) :
$result = pg_query("SELECT id FROM table WHERE creator_id = 50 ORDER BY time_creation DESC LIMIT 50;")
while($row = pg_fetch_row($result)) { pg_query("DELETE FROM table WHERE id=$row[0];) }

l'avantage ça prend 2 lignes, l'inconvenient, ça fait 51 requetes pour detruire 50 lignes...

...j'imagine qu'il y a plus propre, comment feriez vous par exemple ?

merci

Hors ligne

#2 20/06/2011 06:49:20

meles
Membre

Re : DELETE avec ORDER BY et LIMIT...

Bonjour,
  une requête imbriquée ?

 DELETE FROM table WHERE id IN (SELECT id FROM table WHERE creator_id = 50 ORDER BY time_creation DESC LIMIT 50)

Attention, non testée.

Cordialement

Hors ligne

#3 20/06/2011 07:44:01

Marc Cousin
Membre

Re : DELETE avec ORDER BY et LIMIT...

Si on veut vraiment faire du rapide, dans ce genre de cas, on peut faire:

DELETE FROM table WHERE ctid IN (SELECT ctid FROM table WHERE creator_id = 50 ORDER BY time_creation DESC LIMIT 50);

Autant attaquer les adresses physiques des enregistrements (le tid), ce sera plus rapide. Même si pour 50 enregistrements ça n'a pas d'importance. Par contre, évidemment, le ctid, c'est un champ caché, non portable, etc… mais ça évite d'accéder à l'index sur id, c'est plus rapide.

Les ctid ne bougeront pas durant un seul ordre SQL. Le seul risque, c'est d'effacer moins de 50 enregistrements si une transaction concurrente modifie un des enregistrements qu'on essaye d'accéder, durant le delete (le ctid va bouger).


Marc.

Hors ligne

#4 21/06/2011 15:27:53

ilrico
Membre

Re : DELETE avec ORDER BY et LIMIT...

merci !

Hors ligne

Pied de page des forums