Fazer numérica chaves primárias dos excluídos registros em um banco de dados reutilizada para o futuro novos registros?
-
05-07-2019 - |
Pergunta
Por exemplo se eu tiver um campo de numeração automática, adicionar novos registros, sem especificar este campo e deixar o mecanismo de banco de dados para buscá-lo para mim.
Então, vai pegar o número do registro excluído?Se sim, quando?
// O SQL Server, MySQL.//
Solução
NÃO.numérico chaves primárias não serão reutilizados, exceto que você especificar manualmente(você realmente deve evitar isso!)
Outras dicas
AFAIK, este poderia acontecer no MySQL:
Como AUTO_INCREMENT Manuseio Funciona no InnoDB:
O InnoDB utiliza a memória do contador de auto incremento, desde que o servidor é executado.Quando o servidor é parado e reiniciado, o InnoDB reinicializa o contador para cada tabela para o primeiro INSERIR a tabela, conforme descrito anteriormente.
Correção sugerida:tabela innodb não deve perder a pista do próximo número da coluna auto_increment depois reinicie.
Depende do auto-sistema de numeração.Se você estiver usando uma sequência de qualquer tipo, o número de registros excluídos não vai ter reutilizado, como a sequência não sabe sobre eles.
Geralmente, não, os números não são reutilizados.
No entanto, você pode -- em produtos como o Oracle -- especificar um gerador de seqüência que os ciclos redor e reutilização de números.
Se esses são os números de registros excluídos ou não é a sua aplicativos do problema.
Essa pergunta precisa ser feita mais preciso:
..."com o Oracle Sequências"
..."com o MySQL autonumeração colunas"
...etc...
Contanto que você criar a tabela corretamente, você não irá reutilizar números.No entanto, você pode propagar novamente a coluna de identidade (NO MSSQL de qualquer maneira,) usando o seguinte:
-- Insira o número da última entrada válida na tabela não para o próximo número a ser usado
DBCC CHECKIDENT ([TableName], RECOMPARTILHAR, [NumberYouWantToStartAt])
Este é, naturalmente, loucura...e nunca deve ser feito :)
O MySQL não irá reutilizar Identificações, a menos que você truncate
a tabela ou delete from
a tabela sem where
cláusula (no caso do MySQL, internamente, faz simplesmente um truncate
).
Não especificamente.Se a chave está a ser lido a partir de uma sequência ou autoincrementing coluna de identidade de seqüência irá basta ligar e produzir o próximo valor.No entanto, você pode desativar este (set identity_insert on
no SQL Server) e colocar qualquer número que você deseja na coluna, contanto que não viole a restrição de exclusividade.
Sim, isso realmente depende de como você gerar o id.
Por exemplo, se você estiver usando um GUID como a chave primária, a maioria das implementações de conseguir um novo Guid aleatório não são susceptíveis de escolher outro guid novamente, mas ele será dado o tempo suficiente e se o Guid não está na tabela, a instrução insert vai ficar bem, mas se já existe um guid lá você vai ter uma chave primária de violação de restrição.
Eu considero o MySQL "recurso" de reutilização de identificação de um bug.
Considerar algo como processamento de upload de arquivos.Usando o id de banco de dados como um nome de arquivo é uma boa prática :simples, não há risco de explorações com fornecida pelo usuário, nomes de arquivos, etc.
Você realmente não pode fazer tudo transacional quando o sistema de arquivos está envolvido...você vai ter que confirmar a transação de banco de dados, em seguida, gravar o arquivo, ou gravar o arquivo e confirmar a transação de banco de dados, mas, se um ou ambos falharem, ou você tem um acidente, ou o seu sistema de arquivos de rede tem um ajuste, você pode ter um registro válido no banco de dados e nenhum arquivo ou um arquivo sem um registro de banco de dados, desde que a coisa não é atômica.
Se um problema acontece, e a primeira coisa que o servidor faz quando voltar e substituir o id, e, portanto, os arquivos da revertida transações, é uma porcaria.Os arquivos talvez tenham sido úteis.
não, imagine se o seu banco decidi voltar a usar o seu account_id - arghhhh !!