155 votes

Comment supprimer une certaine ligne de la table mysql avec les mêmes valeurs de colonne ?

J'ai un problème avec mes requêtes dans MySQL. Ma table a 4 colonnes et ressemble à quelque chose comme ceci :

id_users    id_product    quantity    date
 1              2              1       2013
 1              2              1       2013
 2              2              1       2013
 1              3              1       2013

id_users et id_product sont des clés étrangères de différentes tables.

Ce que je veux, c'est supprimer une seule ligne :

1     2     1    2013

Qui apparaît deux fois, donc je veux juste le supprimer.

J'ai essayé cette requête :

delete from orders where id_users = 1 and id_product = 2

Mais il les supprimera tous les deux (puisqu'ils sont dupliqués). Avez-vous des conseils pour résoudre ce problème ?

210voto

juergen d Points 85039

Ajouter un limit à la supprimer requête

delete from orders 
where id_users = 1 and id_product = 2
limit 1

64voto

David K Points 21

Toutes les tables doivent avoir une clé primaire (composée d'une ou plusieurs colonnes), les lignes en double n'ont pas de sens dans une base de données relationnelle. Vous pouvez limiter le nombre de lignes supprimées à l'aide de la commande LIMIT cependant :

DELETE FROM orders WHERE id_users = 1 AND id_product = 2 LIMIT 1

Mais cela ne résout que votre problème actuel, vous devez absolument travailler sur le problème plus important en définissant des clés primaires.

20voto

Rob Points 550

Vous devez spécifier le nombre de lignes qui doivent être supprimées. Dans votre cas (et je suppose que vous ne voulez en garder qu'une), cela peut être fait comme suit :

DELETE FROM your_table WHERE id_users=1 AND id_product=2
LIMIT (SELECT COUNT(*)-1 FROM your_table WHERE id_users=1 AND id_product=2)

8voto

praveenraj4ever Points 60

La meilleure façon de concevoir une table est d'ajouter une ligne temporaire comme auto incrément et de la garder comme clé primaire. Ainsi, nous pouvons éviter les problèmes mentionnés ci-dessus.

5voto

Somnath Muluk Points 10173

Il y a déjà des réponses pour Supprimer une rangée par LIMIT . Idéalement, vous devriez avoir une clé primaire dans votre table. Mais s'il n'y en a pas.

Je vais donner d'autres moyens :

  1. En créant Indice unique

Je vois que id_users et id_product doivent être uniques dans votre exemple.

ALTER IGNORE TABLE orders ADD UNIQUE INDEX unique_columns_index (id_users, id_product)

Ceux-ci supprimeront les lignes en double contenant les mêmes données.

Mais si vous obtenez toujours une erreur, même si vous utilisez la clause IGNORE, essayez ceci :

ALTER TABLE orders ENGINE MyISAM;
ALTER IGNORE TABLE orders ADD UNIQUE INDEX unique_columns_index (id_users, id_product)
ALTER TABLE orders ENGINE InnoDB; 
  1. En créant à nouveau la table

Si plusieurs lignes ont des valeurs en double, vous pouvez également recréer le tableau.

RENAME TABLE `orders` TO `orders2`;

CREATE TABLE `orders` 
SELECT * FROM `orders2` GROUP BY id_users, id_product;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X