2017-02-02 3 views
0

Disons, nous avons le my_table tableau suivant:Postgres: tandis que « table a des lignes » boucle ...

id Col1   Col2 
1 some data some data 
2 some data some data 
3 some data some data 
4 some data some data 

supposons plus qu'il ya un processus de mise à jour de la table et après son exécution la table se termine par un plus petit nombre de rangées.

Nous souhaitons itérer ce processus jusqu'à ce que "my_table" ne comporte aucune ligne. Il est certain qu'après un nombre fini d'itérations du processus de mise à jour, la table n'a aucune ligne.

Comment correct est d'essayer STH comme ceci:

while (select count(id) from my_table) != 0 loop 
    update process 
    ...; 
end loop; 
+3

Les mises à jour dans SQL ne suppriment pas les enregistrements, ils modifient (éventuellement) les données dans les enregistrements qui existent déjà. –

+0

oui, vous avez raison. Mon omission de mentionner que le processus de mise à jour concerne non seulement 'my_table' mais aussi 'other_table'. La mise à jour de ce dernier conduit à réduire le nombre de lignes dans le premier. Merci pour le commentaire, mais la réponse ci-dessous a attiré l'attention. –

Répondre

1

Vous devrez ajouter des transactions pour le rendre fiable, sinon vous avez aucune garantie qu'un autre utilisateur ou le processus d'ajouter une ligne après vous les comptez mais avant la mise à jour s'exécute. Vous avez réellement besoin de:

while not done 
    begin transaction 
     if (count rows > 0) 
     do something that expects rows 
     else 
     done 
    end transaction