Modelo próxima chave primária disponível

votos
6

Como posso saber a próxima chave primária livre de algum modelo?

Publicado 24/02/2009 em 01:11
fonte usuário
Em outras línguas...                            


5 respostas

votos
17

Mesmo se você pode consultar o seguinte valor da chave primária disponível, não iria ajudá-lo. A menos que você bloquear a tabela, você não pode usar esse valor antes de algum outro cliente de banco de dados pode agarrá-lo para a sua inserção.

Em vez disso, você deve apenas inserir sua linha e, em seguida, você pode consultar o mais recente valor de chave gerado durante a sua sessão atual. Cada banco de dados que suporta chaves primárias geradas automaticamente fornece um método para recuperar a chave mais recente inserido durante a sessão.

O "durante a sessão" parte é importante porque protege sua sessão de quaisquer inserções sendo feito simultaneamente por outros clientes. Eles podem gerar valores de chave e sua sessão continuará a se reportar o mesmo valor que inserido mais recentemente.

@Stuart Childs supõe que o MySQL gera a próxima ID com MAX(column_name)+1mas isso é incorreto. Digamos que você inserir uma linha e um valor de ID é gerado. Mas você reverter essa inserção, ou posteriormente DELETEnessa linha. A próxima vez que você inserir, MySQL irá gerar um valor ID nova marca. Portanto, o valor ID é maior do que o último valor ID gerado por qualquer cliente , independentemente do que as linhas são atualmente armazenados na tabela.

Da mesma forma, se você inserir mas não cometer imediatamente. Antes de se comprometer, algum outro cliente faz uma inserção. Ambos sua sessão e sessão de outro cliente terá seu próprio valor de identificação exclusivo gerado. chaves primárias geradas automaticamente operar sem levar em conta isolamento da transação, para garantir a exclusividade.

valores de chave primária gerados automaticamente não são re-utilizados ou alocados para mais de uma sessão, mesmo se você ainda não se comprometeram a sua inserção, ou se você reverter a inserção, ou se você excluir a linha.

Respondeu 24/02/2009 em 02:12
fonte usuário

votos
2

-Usar Django e Mysql

next_id = Table.objects.filter (id__gt = current_id) [0] .id

Respondeu 12/06/2014 em 02:36
fonte usuário

votos
0

Eu tinha essa mesma pergunta, porque eu estava duplicar um elemento e eu queria mudar sua pk para um novo para ser capaz de inseri-lo.

Minha solução foi a seguinte:

import copy
objectCopy=copy.copy(object)
objectCopy.pk=None
objectCopy.save()

Quer dizer, se save()faz isso por você, por que você iria querer fazê-lo manualmente?

Respondeu 23/05/2010 em 22:35
fonte usuário

votos
-1

este trecho irá certamente ajudá-lo.

Respondeu 17/01/2013 em 13:00
fonte usuário

votos
-1

Eu acho que você vai ter que executar alguns SQL personalizada . O SQL que você precisa será DB específico. Tanto quanto eu sei, não há nenhuma maneira confiável para fazer isso no MySQL. Você pode obter a última inserção ID mas é específica sessão (ou seja, você pode obter o ID do último registro inserido na sua sessão DB mas não o último ID para outra sessão que pode ter acontecido após o seu). No entanto (e alguém me corrija se eu estiver errado), MySQL gera a próxima ID com MAX (column_name) + 1 para que você possa fazer o mesmo.

PostgreSQL torna muito mais fácil com as suas funções de manipulação de sequência .

Editar:

Revela-se pensava de AUTO_INCREMENTcolunas no interior de uma chave de várias colunas que são gerados com MAX (column_name) 1. No entanto, o ponto ainda está de pé que não há maneira de recuperar o próximo ID antes de ele é gerado por uma inserção, que era a pergunta original.

Respondeu 24/02/2009 em 01:53
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more