Como excluir uma determinada linha da tabela mysql com os mesmos valores de coluna?


153

Eu tenho um problema com minhas consultas no MySQL. Minha tabela tem 4 colunas e é algo como isto:

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

id_userse id_productsão chaves estrangeiras de tabelas diferentes.

O que eu quero é excluir apenas uma linha:

1     2     1    2013

Que aparece duas vezes, então eu só quero excluí-lo.

Eu tentei esta consulta:

delete from orders where id_users = 1 and id_product = 2

Mas ele excluirá os dois (já que eles são duplicados). Alguma dica para resolver esse problema?

Respostas:


208

Adicione limita à consulta de exclusão

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

3
Isso exclui apenas uma linha. Se houvesse 3 com esse usuário e o ID do produto, restariam 2.
22413 Rob

10
Sim, os OP dizem que ele deseja excluir 1 linha. É isso que minha consulta faz.
precisa saber é o seguinte

2
Sim, mas acho que não é isso que ele / ela quer.
Rob

3
Obrigado Juergen. Isso é tudo que eu preciso!
22413 Dani

3
O que o OP realmente precisa fazer é verificar primeiro quais linhas estão duplicadas e excluir as duplicatas.
wbinky

64

Todas as tabelas devem ter uma chave primária (consistindo em uma única ou várias colunas), linhas duplicadas não fazem sentido em um banco de dados relacional. Você pode limitar o número de linhas de exclusão usando LIMIT:

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

Mas isso apenas resolve o problema atual, você definitivamente deve trabalhar no problema maior definindo chaves primárias.


1
É bom mencionar que a chave primária deve ser exclusiva em um banco de dados relacional.
Paul

1
@ Paul É exatamente isso que eu estou prestes a dizer. Mas não se esqueça que chave única não significa chave primária.
Ryan Fung

20

Você precisa especificar o número de linhas que devem ser excluídas. No seu caso (e presumo que você deseja apenas manter um), isso pode ser feito assim:

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)

Obrigado Rob, mas não ... Eu só quero excluir uma única linha, não para manter apenas um
Dani

Isso não está funcionando para mim no 5.5.40, gera um erro de sintaxe. Conforme mencionado aqui: stackoverflow.com/a/578926/1076075 , parece que não podemos usar uma subconsulta para especificar o valor de uma cláusula LIMIT. Para qualquer um que tenta fazer coisas desta forma, vejam isto: stackoverflow.com/q/578867/1076075
Bharadwaj Srigiriraju

8

A melhor maneira de criar uma tabela é adicionar uma linha temporária como incremento automático e manter como chave primária. Para que possamos evitar esses problemas acima.


1
Ou uma fila permanente. Sei que essa é uma pergunta antiga, mas acho que devo dizer. Os IDs são usados ​​para esse tipo de situação. Se você está preocupado com o espaço: um BIGINT tem apenas 8 bytes!
Ismael Miguel

5

Já existem respostas para Excluir linha por LIMIT . Idealmente, você deve ter a chave primária em sua tabela. Mas se não houver.

Vou dar outras maneiras:

  1. Criando índice exclusivo

Vejo id_users e id_product devem ser únicos no seu exemplo.

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

Isso excluirá linhas duplicadas com os mesmos dados.

Mas se você ainda receber um erro, mesmo se usar a cláusula IGNORE, tente o seguinte:

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. Criando tabela novamente

Se houver várias linhas com valores duplicados, você também poderá recriar a tabela

RENAME TABLE `orders` TO `orders2`;

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

1

Você deve adicionar um ID que incremente automaticamente para cada linha, depois disso você pode excluir a linha pelo seu ID. para que sua tabela tenha um ID exclusivo para cada linha e o id_user, id_product ecc ...

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.