¿Cómo eliminar una determinada fila de la tabla mysql con los mismos valores de columna?

153

Tengo un problema con mis consultas en MySQL. Mi tabla tiene 4 columnas y se ve así:

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

id_usersy id_productson claves foráneas de diferentes tablas.

Lo que quiero es eliminar solo una fila:

1     2     1    2013

Que aparece dos veces, así que solo quiero eliminarlo.

He intentado esta consulta:

delete from orders where id_users = 1 and id_product = 2

Pero los eliminará a ambos (ya que están duplicados). ¿Alguna pista para resolver este problema?

Dani
fuente

Respuestas:

208

Agregar limita la consulta de eliminación

delete from orders 
where id_users = 1 and id_product = 2
limit 1
juergen d
fuente
3
Esto solo elimina una fila. Si hubiera 3 con este usuario y la identificación del producto, quedarían 2.
Rob
10
Sí, OP dice que quiere eliminar 1 fila. Eso es lo que hace mi consulta.
juergen d
2
Sí, pero creo que esto no es lo que él / ella quiere.
Rob
3
Gracias Juergen ¡Esto es todo lo que necesito!
Dani
3
Lo que OP realmente necesita hacer es verificar primero qué filas están duplicadas y luego eliminar los duplicados.
wbinky
64

Todas las tablas deben tener una clave primaria (que consta de una o varias columnas), las filas duplicadas no tienen sentido en una base de datos relacional. Sin LIMITembargo, puede limitar el número de filas eliminadas mediante :

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

Pero eso solo resuelve su problema actual, definitivamente debería trabajar en el problema más grande definiendo las claves principales.

dnet
fuente
1
Es bueno mencionar que la clave primaria debe ser única en una base de datos relacional.
Paul
1
@Paul Esto es exactamente lo que voy a decir. Pero no olvide que la clave única no necesariamente significa clave primaria.
Ryan Fung
20

Debe especificar el número de filas que se deben eliminar. En su caso (y supongo que solo desea conservar uno), esto puede hacerse así:

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)
Robar
fuente
Gracias Rob, pero no ... Solo quiero eliminar una sola fila, no mantener solo una
Dani
Esto no me funciona en 5.5.40, arroja un error de sintaxis. Como se menciona aquí: stackoverflow.com/a/578926/1076075 , parece que no podemos usar una subconsulta para especificar el valor de una cláusula LIMIT. Para cualquiera que intente hacer cosas de esta manera, consulte esto: stackoverflow.com/q/578867/1076075
Bharadwaj Srigiriraju
8

La mejor manera de diseñar una tabla es agregar una fila temporal como incremento automático y mantenerla como clave principal. Entonces podemos evitar tales problemas anteriores.

praveenraj4ever
fuente
1
O una fila permanente. Sé que esta es una vieja pregunta, pero creo que debería decirla. Las identificaciones se utilizan para este tipo de situación. Si le preocupa el espacio: ¡BIGINT tiene solo 8 bytes!
Ismael Miguel
5

Ya hay respuestas para Eliminar fila por LIMIT. Idealmente, debe tener la clave principal en su tabla. Pero si no hay.

Daré otras formas:

  1. Al crear un índice único

Veo id_users e id_product deberían ser únicos en su ejemplo.

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

Estos eliminarán filas duplicadas con los mismos datos.

Pero si aún recibe un error, incluso si usa la cláusula IGNORE, intente esto:

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. Al crear la tabla nuevamente

Si hay varias filas que tienen valores duplicados, también puede volver a crear la tabla

RENAME TABLE `orders` TO `orders2`;

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

Debe agregar una identificación que se incremente automáticamente para cada fila, después de eso puede eliminar la fila por su identificación. entonces su tabla tendrá una identificación única para cada fila y el id_user, id_product ecc ...

Andrei Tornea
fuente