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?
Ajouter un limit
à la requête supprimer
delete from orders
where id_users = 1 and id_product = 2
limit 1
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.
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)
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.
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:
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;
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;
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 ...