2011-05-24 3 views
33

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.MySQL LIMIT sur l'instruction DELETE

L'erreur dont je parle est « Vous avez une erreur dans votre syntaxe SQL, consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser à proximité « LIMIT 1 » à la ligne 1 »

Le tableau que j'ai mis ensemble est appelé test; il a 3 colonnes, id, nom et créé. J'ai peuplé la table avec plusieurs enregistrements, puis j'ai tenté d'en supprimer un. Voici la déclaration que j'ai utilisée pour essayer d'accomplir ceci.

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

Sans l'utilisation de LIMIT 1, la déclaration ne fait qu'exécuter bien, mais bien sûr, je ne serais pas l'utilisation de LIMIT s'il n'y avait pas besoin. Je suis pleinement conscient que je peux utiliser une autre instruction pour accomplir cette DELETE avec succès. Voir ci-dessous: DELETE FROM test WHERE name = 'foo' LIMIT 1

Cependant, ma question est centrée sur pourquoi la première instruction ne fonctionne pas avec LIMIT.

Donc, ma question est, ce que j'ai fait incorrectement en ce qui concerne la première déclaration pour générer cette erreur?

Répondre

18

La requête de suppression n'autorise que les modificateurs après la commande 'DELETE' pour dire à la base de données quoi/comment gérer les choses.

voir this page

+10

"Cependant, vous ne pouvez pas utiliser ORDER BY ou LIMIT dans un DELETE à plusieurs tables". Cela semble répondre à ma question. – Andre

+1

oui - désolé n'a pas lu cela de l'OP mais ce que vous dites sur la suppression d'une jointure est correct –

24

utiliser simplement

DELETE FROM test WHERE 1= 1 LIMIT 10 
+1

L'OP a clairement déclaré qu'il sait que cela fonctionne ... "Je suis pleinement conscient que je peux utiliser une autre déclaration pour accomplir ce DELETE avec succès. [...] 'DELETE FROM test WHERE nom = 'foo' LIMIT 1'" –

2

Utilisez row_count - your_desired_offset

Donc, si nous avions 10 lignes et que vous voulez pour compenser 3

10 - 3 = 7 

Maintenant, la requête delete from table where this = that order asc limit 7 conserve la dernière 3, et order desc à ke ep les 3 premiers:

$row_count - $offset = $limit 

Delete from table where entry = criteria order by ts asc limit $limit 
4
DELETE t.* FROM test t WHERE t.name = 'foo' LIMIT 1 

@Andre Si je comprends bien ce que vous demandez, je pense que la seule chose qui manque est le t * avant FROM..