Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Foccos

Remover Todos os Registros SQL Exceto Primeiro

Recommended Posts

Estou com uma dúvida para realizar a remoção de registros na tabela exceto o primeiro registro, eu consigo fazer o select dos registros normalmente mas não o delete.

 

SELECT * FROM boleto WHERE id_inq = '2' AND id > (SELECT id FROM boleto ORDER BY id LIMIT 1)
Como faço pra poder excluir todos os registros com id 2 por exemplo, exceto o primeiro registro dessa condição?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você já tem meio caminho andado, os registros que quer apagar, agora basta apagá-los:

DELETE FROM boleto
WHERE
    id IN (
       SELECT id FROM  boleto WHERE id_inq = '2' AND id > (SELECT id FROM boleto ORDER BY id LIMIT 1)
   )

Você também pode fazer desse modo:

DELETE FROM boleto
WHERE id_inq = '2' AND id > (SELECT id FROM boleto ORDER BY id LIMIT 1)

Utilize transactions e/ou faço um backup para evitar problemas em apagar algum registro inesperado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel , fui realizar uma remoção de teste direto no phpmyadmin , ele me retornou o seguinte erro:

 

#1093 - You can't specify target table 'boleto' for update in FROM clause

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse é um problema do MySQL (estou acostumado com outros SGBDs) onde não se pode utilizar um sub select da tabela que quer se modificar.

 

Utilize o segundo delete que lhe mandei.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testei com os 2 DELETES e retornaram o mesmo erro, pensei em uma solução mas utilizaria mais processos e não sei se seria viável que é a seguinte, eu realizo o SELECT e guardo em uma tabela temporária, depois eu faria um DELETE na tabela e apagava esses registros selecionados, e depois inseria esse registro temporário de volta. Você tem alguma outra sugestão?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A tabela temporária é uma solução, mas você também pode usar variáveis no MySQL.

 

SET @id = (SELECT id FROM boleto ORDER BY id LIMIT 1);

DELETE FROM boleto WHERE id_inq = '2' AND id > @id;

Em teoria funciona. Não consigo testar no momento.

 

Se essa query for recorrrente, crie uma procedure e apenas execute-a. Você poderá utilizar o id_inq como parâmetro para flexibilizar a execução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

remoção de registros na tabela exceto o primeiro registro

 

teste primeiro com esse comando:

select * from TABELA where id >= 2

se for realmente isso que vc deseja:

Delete from TABELA where id >= 2

caso vc não saiba qual é esse id, vc pode usar uma subconsulta:

select * from TABELA where id not in(select min(id) from tabela)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fernando C , esse comando funcionaria caso fossem todos os registros da tabela, mas no meu caso são todos os registros da tabela limitados por um determinado usuário, que vem pela chave estrangeira id_inq , eu preciso remover todos exceto o primeiro somente desse usuário específico. A solução do Gabriel me atendeu, mesmo assim obrigado pela resposta ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

são todos os registros da tabela limitados por um determinado usuário

 

ah, ta.. nesse caso precisa adicionar a outra condição, c/ certeza.. :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só complementando ... talvez ajude mais alguém, eu precisava alterar o primeiro registro dessa pesquisa e remover o restante deles, o meu SQL ficou assim:

 

// Ele verifica qual o primeiro registro
SET @id = (SELECT id FROM boleto ORDER BY id LIMIT 1);

// Remove todos os registros do id indicado menos o primeiro.
DELETE FROM boleto WHERE id_inq = '2' AND id > @id;

// Altera o valor desse primeiro registro que sobrou
UPDATE boleto SET valor_boleto = 777 WHERE id_inq = '2'

Coloquei os valores fixos como exemplo, mas todos os valores utilizei variáveis ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT id FROM boleto ORDER BY id LIMIT 1

só 1 obs: se id for uma chave primária, vc pode usar tb max(id) ou min(id)(funções de agregação), pq nem todo banco trabalha com a cláusula limit..

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.