web-dev-qa-db-fra.com

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 cela ressemble à 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 provenant de tables différentes.

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

1     2     1    2013

Ce qui apparaît deux fois, alors je veux juste le supprimer.

J'ai essayé cette requête:

delete from orders where id_users = 1 and id_product = 2

Mais cela supprimera les deux (car ils sont dupliqués). Des astuces pour résoudre ce problème?

152
Dani

Ajouter un limit à la requête supprimer

delete from orders 
where id_users = 1 and id_product = 2
limit 1
199
juergen d

Toutes les tables doivent avoir une clé primaire (composée d'une ou de plusieurs colonnes), les doublons de lignes n'ont aucun sens dans une base de données relationnelle. Vous pouvez limiter le nombre de lignes à supprimer à l'aide de LIMIT bien que:

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

Mais cela résout simplement votre problème actuel, vous devriez certainement travailler sur le plus gros problème en définissant des clés primaires.

62
dnet

Vous devez spécifier le nombre de lignes à supprimer. Dans votre cas (et je suppose que vous ne voulez en garder qu'un), ceci peut être fait comme ceci:

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)
20
Rob

La meilleure façon de concevoir une table consiste à ajouter une ligne temporaire en incrémentation automatique et à la conserver en tant que clé primaire. Ainsi, nous pouvons éviter les problèmes ci-dessus.

8
praveenraj4ever

Il existe déjà des réponses pour Supprimer une ligne de 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 Index unique

Je vois id_users et id_product devrait être unique dans votre exemple.

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

Ceux-ci supprimeront les lignes en double avec 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 recréant la table

Si plusieurs lignes contiennent des valeurs en double, vous pouvez également recréer la table.

RENAME TABLE `orders` TO `orders2`;

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

Vous devez ajouter un identifiant qui s'incrémente automatiquement pour chaque ligne. Vous pouvez ensuite supprimer la ligne par son identifiant. votre table aura donc un identifiant unique pour chaque ligne et id_user, id_product ecc ...

1
Andrei Tornea