web-dev-qa-db-fra.com

MySQL LIMIT sur l'instruction DELETE

J'ai mis en place une table de test pour une erreur que j'ai récemment rencontrée. Cela implique l'utilisation de LIMIT lorsque vous essayez de supprimer un seul enregistrement d'une table MySQL.

L'erreur dont je parle est "Vous avez une erreur dans votre syntaxe SQL; consultez le manuel correspondant à la version de votre serveur MySQL pour connaître la syntaxe correcte à utiliser près de 'LIMIT 1' à la ligne 1"

La table que je compose est appelée test ; il a 3 colonnes, id , nom et créé . J'ai rempli la table avec plusieurs enregistrements, puis j'ai essayé d'en supprimer un. Vous trouverez ci-dessous la déclaration que j'avais l'habitude d'essayer d'accomplir.

DELETE t FROM test t WHERE t.name = 'foo' LIMIT 1

Sans l'utilisation de LIMIT 1, l'instruction est parfaitement exécutée, mais bien entendu, je n'utiliserais pas LIMIT s'il n'était pas nécessaire.

Je suis tout à fait conscient que je peux utiliser une autre déclaration pour accomplir cette suppression avec succès. Voir ci-dessous: DELETE FROM test WHERE name = 'foo' LIMIT 1

Cependant, ma question est centrée sur les raisons pour lesquelles la première déclaration ne fonctionne pas avec LIMIT.

Ma question est donc la suivante: qu'est-ce que j'ai mal fait en ce qui concerne la première déclaration générant cette erreur?

49
Andre

la requête de suppression autorise uniquement les modificateurs après la "commande" DELETE à indiquer à la base de données ce que/comment gérer les choses.

voir cette page

21
Ian Wood

simplement utiliser

DELETE FROM test WHERE 1= 1 LIMIT 10 
31
Manoj Gupta
DELETE t.* FROM test t WHERE t.name = 'foo' LIMIT 1

@Andre Si j'ai bien compris ce que vous demandez, je pense qu'il ne manque que le t. * Avant FROM.

6
ThelmaJay

Utilisation row_count - your_desired_offset

Donc, si nous avions 10 lignes et voulons compenser 3

 10 - 3 = 7

Maintenant la requête delete from table where this = that order asc limit 7 conserve les 3 derniers et order desc garder les 3 premiers:

$row_count - $offset = $limit

Delete from table where entry = criteria order by ts asc limit $limit
1

De la documentation :

You cannot use ORDER BY or LIMIT in a multiple-table DELETE.
1
Michel de Ruiter