[Mysql] DELETE et conserver un nombre fixe de lignes

DELETE et conserver un nombre fixe de lignes [Mysql] - SQL/NoSQL - Programmation

Marsh Posté le 29-04-2011 à 11:11:22    

Bonjour,
 
Je cherche à réaliser une requête sous mysql qui conserverait un nombre fixe de lignes lors d'un Delete - concrètement "Ne garder que les 20 premières lignes et supprimer le reste".
 
J'ai essayé ceci :
 

Code :
  1. DELETE FROM vtiger_account
  2. WHERE accountid NOT IN
  3. (SELECT accountid FROM vtiger_account
  4. LIMIT 20)


 
Mais mysql il gère pas (encore) les Limits dans les sous-requêtes [:cerveau manust]
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
 
Auriez-vous une solution compatible pour mysql ?  
 
D'avance, merci


---------------
À défaut des dragons il me reste les moulins
Reply

Marsh Posté le 29-04-2011 à 11:11:22   

Reply

Marsh Posté le 29-04-2011 à 11:52:42    

Bonjour :)  
Quelle est ta version de MySQL ? Il me semble qu'a partir de la version 4.1 ta requête devrait fonctionner.

Reply

Marsh Posté le 29-04-2011 à 13:15:46    

Bonjour Actualinet,
 
La version que j'utilise est plutôt récente, il s'agit de la 5.5.8.


---------------
À défaut des dragons il me reste les moulins
Reply

Marsh Posté le 29-04-2011 à 13:44:49    

Bizarre
 
sur ce site : http://mysql.bigresource.com/Track/mysql-boUmSoYU/
 
il y a cette requête qui ressemble à la tienne, à part le order by:

Code :
  1. DELETE FROM yourtable WHERE somekey NOT IN
  2. (SELECT somekey FROM yourtable
  3. ORDER BY timecolumn DESC LIMIT 10)


 
C'est un vieux post de 2005, je ne sait pas trop ce que ça vaut...

Reply

Marsh Posté le 29-04-2011 à 14:58:42    

En fait, même si j'arrive à faire passer mon LIMIT d'une façon ou d'une autre, la requête ne sera pas correcte parce que MySQL interdit proprement l'appel d'une même table dans une sous requête lors d'un update.  
 
Pour contourner le problème avec UPDATE il suffit de passer par des alias mais par contre avec DELETE c'est une autre histoire... donc me voilà retombé sur un autre os [:jeanlucpicard]
 
Sauf qu'avec un petit peu de bricole j'y suis finalement arrivé ! avec l'utilisation du LIMIT aussi :)
 

Code :
  1. DELETE
  2. FROM vtiger_account
  3. WHERE accountid NOT IN
  4. (SELECT accountid 
  5. FROM (SELECT accountid FROM vtiger_account LIMIT 20) AS V2)


 
Traitement pas trop lent avec ça : 3331 ligne(s) supprimée(s). ( Traitement en 0.5180 sec. )
 
Merci pour ton aide et attention  :hello:


---------------
À défaut des dragons il me reste les moulins
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed