como fazer um delete em uma determinada tupla sem where?

SQL

Firebird

03/01/2019

Boa tarde.
Vou explicar brevemente o meu problema.

Estou com um banco de dados .fdb com uma tupla corrompida (acredito que seja a linha 10452, pois após dar um select * from table, o programa trava nessa linha e retornar uma mensagem de que há dados corrompidos).

Tentei rodar vários utilitários do Firebird para restaurar os dados e não deu certo, então quero deletar as linhas com problemas perdendo o mínimo de informação possível.

Infelizmente essa tabela não tem um campo de código sequencial para eu adicionar a clausula WHERE.
Alguém sabe se existe alguma função ou comando em SQL para apagar o registro número 10452? Parecido com o TOP por exemplo, onde podemos selecionar as primeiras X linhas.
Lucas Guimaraes

Lucas Guimaraes

Curtidas 0

Respostas

Vinicius Cavagnolli

Vinicius Cavagnolli

03/01/2019

Olá Lucas,

Todo banco Firebird cria um sequencial único para cada registro, internamente. Você pode tentar excluir a tupla usando este código, porém sem Where é logicamente impossível.

Eu recomendaria apagar usando um Where contendo todos os dados da linha, para apagar o menor número de registros possíveis.

Senão, resta usar o RDB$DB_KEY. Para saber ele é só usar 'select tabela.*, rdb$db_key from tabela'. Mas vale mencionar que é um array de bytes, então tem que ser convertido para blob 'cast(rdb$db_key as blob)' no melhor dos casos, podendo ser usado para apagar o menor número de tuplas possíveis. Para usá-lo com precisão, o único jeito seria usar algum programa para filtrar esse array de bytes (mais fácil em uma linguagem de nível mais baixo, como C++).
GOSTEI 0
POSTAR