2010-12-03 6 views
5

Je souhaite sélectionner la première ligne d'un tableau, classée par time (ascendant), puis supprimer cette ligne. Je ne veux pas utiliser deux requêtes car il est possible qu'un autre client sélectionne cette ligne avant qu'elle ne soit supprimée (plusieurs machines seront connectées à la fois à partir de différents réseaux).SELECT et DELETE

Je pensais que je pouvais faire quelque chose comme

SELECT * FROM `mytable` ORDER BY `time` LIMIT 1; 
    DELETE FROM `mytable` ORDER BY `time` LIMIT 1 

... mais je suis une erreur:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; DELETE * FROM pending ORDER BY time LIMIT 1' at line 1

Quelle est la meilleure façon de le faire? Merci.

Répondre

4

Re votre message d'erreur (différent de celui de votre question):

DELETE * FROM pending ORDER BY time LIMIT 1 

Cela ressemble à une erreur dans votre syntaxe. Essayez de supprimer le *. C'est-à-dire,

DELETE FROM pending ORDER BY time LIMIT 1 

Devrait fonctionner correctement.

2

Vous devez créer une table temporaire, MySQL ne vous permet pas de supprimer d'une table que vous utilisez, voir ce code:

insert tmpTable 
     (id) 
select id 
from YourTable yt 
order by time limit 1; 

delete 
from YourTable 
where ID in (select id from tmpTable); 
+0

Faut-il supprimer tmpTable plus tard ou ..? –

+1

Oui (15 caractères) –

+0

Vous n'avez pas besoin de créer une table temporaire explicitement. Vous pouvez utiliser une table dérivée 'delete from YourTable où ID = (sélectionnez id from (sélectionnez id depuis YourTable order par time limit 1) t);'. Mais la réponse de Riedsio semble encore meilleure. –

1

Vous pouvez utiliser des sous-requêtes comme.

delete from table where id in (select id from table order by time limit 1); 

Performance sage ne suis pas sûr, quelle est cette solution. Vous devrez peut-être faire une analyse et voir comment cela fonctionne pour vous.

Questions connexes