windfall Posted September 29, 2011 Report Share Posted September 29, 2011 Bom dia, estou com uma dúvida. Não consigo criar uma query que exclua todos os registros de uma tabela, EXCETO os últimos 20.Alguém teria idéia de como resolver isto?Att. Quote Link to comment Share on other sites More sharing options...
0 tércio fernandes Posted September 29, 2011 Report Share Posted September 29, 2011 sempre sobra 20?tenta DELETE from nome_da_tabela; Quote Link to comment Share on other sites More sharing options...
0 windfall Posted September 29, 2011 Author Report Share Posted September 29, 2011 Olá Tércio, sim, sempre sobrará 20.O que você sugeriu vai excluir tudo. Quote Link to comment Share on other sites More sharing options...
0 CAIO.EXE Posted September 30, 2011 Report Share Posted September 30, 2011 cara faz o seguinte,se sua tabela tiver um campo ID auto incrementadicione a condição:WHERE ID < (select max(id) - 20 from tabela_que_vai_deletar)agora,se você não tiver este campo incremental, deverá primeiro criar uma querie que retorne a linha 20 em ordem descrescente e jogar em uma variavelselect IDfrom tabelaorder by 1 desclimit 20,1 Quote Link to comment Share on other sites More sharing options...
0 tércio fernandes Posted September 30, 2011 Report Share Posted September 30, 2011 windfallme desculpe eu entendi completamente errado. Quote Link to comment Share on other sites More sharing options...
0 Denis Courcy Posted October 4, 2011 Report Share Posted October 4, 2011 cara faz o seguinte,se sua tabela tiver um campo ID auto incrementadicione a condição:WHERE ID < (select max(id) - 20 from tabela_que_vai_deletar) agora, se você não tiver este campo incremental, deverá primeiro criar uma querie que retorne a linha 20 em ordem descrescente e jogar em uma variavel select ID from tabela order by 1 desc limit 20,1 A primeira resposta WHERE ID < (select max(id) - 20 from tabela_que_vai_deletar) Não funciona. pois se o ID já sofreu exclusão a numeração estará com saltos e o resultado da subtração falhará. A segunda resposta só funcionará se o select para achar os vinte últimos, for executado independentemente da ação de exclusão. Ou seja se você colocar o select como parte da cláusula where do delete, então haverá erro. Exemplo: DELETE FROM tabela_que_vai_deletar WHERE ID = (select ID from tabela order by 1 desc limit 20,1) Haverá erro. O Correto será: SET @VARIAVEL = (select ID from tabela order by 1 desc limit 20,1); DELETE FROM tabela_que_vai_deletar WHERE ID < @VARIAVEL; Quote Link to comment Share on other sites More sharing options...
0 Aurélio Moreira Posted October 6, 2011 Report Share Posted October 6, 2011 Uma opção seria essaset @limit = (select count(*) from tabela_que_vai_excluir )-20; delete from tabela_que_vai_excluir order by id asc limit 0,@limit acho que isso vai resolver, mas so explicando: em set @limit = (select count(*) from tabela_que_vai_excluir )-20; estou pegando o numero total de registo e reduzindo os 20 que você quer manter. e aqui delete from tabela_que_vai_excluir order by id asc limit 0,@limitesta deletando em ordem acendente (asc) todos os registros dentro do limite que você deseja, assim ele vai preservar os ultimos 20 registros. Quote Link to comment Share on other sites More sharing options...
Question
windfall
Bom dia,
estou com uma dúvida. Não consigo criar uma query que exclua todos os registros de uma tabela, EXCETO os últimos 20.
Alguém teria idéia de como resolver isto?
Att.
Link to comment
Share on other sites
6 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.