Casa
Top.Mail.Ru Yandeks.Metrika
Fórum: "Bases";
Arquivo atual: 2002.01.08;
Download: [xml.tar.bz2];

Para baixo

Determinar o primeiro ID grátis Encontre agências semelhantes


S_King   (2001-12-04 10:18) [0]

Ajudar assistentes como determinar o número 1 livre no procedimento armazenado? Temos uma tabela com um campo preenchido (1,2,4,5 ...), ou seja O procedimento deve emitir 3.



Vadim   (2001-12-04 10:51) [1]

Apenas "torto" - pesquisa através de linhas, ou com a ajuda de uma tabela auxiliar. Talvez você possa definir a tarefa de forma diferente?



Владислав   (2001-12-04 10:57) [2]

Faça uma seleção, classificada em ordem crescente. Percorra todos os registros (bem, não todos, mas até encontrar o número que você precisa) encontrar o que você precisa e usar.

Somente se você quiser obter um número único, esta não é a melhor opção (e talvez a pior). Imagine o que acontece se dois usuários receberem simultaneamente esse número.



Yuvich   (2001-12-04 16:11) [3]

Se a tarefa é exatamente assim, então elimine a situação descrita por Vladislav ("Imagine o que acontece se dois usuários receberem um número ao mesmo tempo."), Você deve aplicar o que Vadim sugere ("usando uma tabela auxiliar").

A tabela auxiliar é uma lista de "buracos" nos quartos. Como o buraco foi formado - foi inserido nesta tabela; como preencher o buraco - leia o número mínimo desta tabela e exclua este número desta tabela. Tudo é feito em gatilhos e quando a "tabela de furos" é bloqueada, então dois usuários nunca lerão o mesmo número. Se o método de cálculo é usado, então você precisa bloquear toda a “tabela de destino” - o que é ruim para outros usuários que podem simplesmente ler os dados.



S_King   (2001-12-04 16:43) [4]

Tudo isso é compreensível, mas pode ser possível percorrer o ciclo.
de 1 para max (Id) na loja. procedimento?

P / S: Desculpe, pode ser uma pergunta mal formulada.



Vadim   (2001-12-04 16:52) [5]

É possível, mas existe um "mas": não é garantido que dois usuários não irão iniciar simultaneamente "girar o ciclo" e não tropeçarão no mesmo "buraco" (eu pessoalmente avalio essa probabilidade como muito alta). Se, pela condição do problema, é permissível - no caminho, se não, veja acima.



dmitryK   (2001-12-04 17:12) [6]

Se você usa um servidor SQL, é lógico resolver esses problemas com uma consulta SQL, ou seja, algo assim

selecione min (t1.ID) + 1
de tabX t1 left join tabX t2 em t1.ID = t2.ID + 1
onde onde t2.ID é NULL

ainda funcionará mais rápido que a força bruta. E você também pode implementar isso com a ajuda do log de registros excluídos. Você suspende o gatilho para excluir o registro (befora) e salva todo o ID dos registros excluídos em uma tabela separada. Nesse caso, ao adicionar novos registros, praticamente não há perda de tempo para pesquisa (crítico ao adicionar simultaneamente um grande número de registros). E para que dois usuários não capturem um ID e você inclua uma entrada no registro em uma transação.



S_King   (2001-12-05 09:55) [7]

Desculpe pessoal, mas eu não perguntei sobre vários usuários ...
Mas como fazer um ciclo para uma única mesa?



dmitryK   (2001-12-05 10:49) [8]

Algo agora eu não entendo, você perguntou como encontrar o mínimo de identificação livre. Eu te dei uma consulta como fazer isso. Por que, você se pergunta, você também precisa organizar um ciclo?



S_King   (2001-12-05 11:21) [9]

Eu, que não entendi o texto da consulta, é possível criá-lo para a mesma tabela?



dmitryK   (2001-12-05 12:33) [10]

selecione min (t1.ID) + 1
de tabX t1 left join tabX t2 em t1.ID = t2.ID + 1
onde onde t2.ID é NULL

tabX - esta é a sua mesa. Ela se une. Como resultado, você recebe uma solicitação que inclui duas colunas com o ID
o primeiro é todos os IDs na sua mesa,
o segundo - se ID + 1 for, então seu valor, se não, então NULL

onde onde t2.ID é NULL - deixa apenas aqueles em que a segunda coluna é NULL, ou seja, ID + 1 grátis.

min (t1.ID) + 1 - retorna o número de ID livre mínimo.

Leia mais sobre a descrição da linguagem SQL.

Tal solicitação tem apenas uma desvantagem, deve haver pelo menos um registro na tabela e o número de ID livre sempre será maior que o mínimo ocupado.
Mas isso é outra história ...



S_King   (2001-12-05 16:32) [11]

Eu não sei porque, mas eu tenho essa consulta trava o banco de dados até a morte.
tentou em consol, especialista



Страницы: 1 filial inteira

Fórum: "Bases";
Arquivo atual: 2002.01.08;
Download: [xml.tar.bz2];

em cima









Memória: 0.85 MB
Hora: 0.048 c
1-22061
Movimentação da roda
2001-12-18 19:44
2002.01.08
Por que o formulário MDI não exibe MDIChild no menu ???


1-22217
Greenrul
2001-12-16 02:13
2002.01.08
TreeView - um par de perguntas


1-22067
DNT
2001-12-15 16:20
2002.01.08
Dialog & dll


1-22196
T2
2001-12-16 07:18
2002.01.08
Desktop off


14-22415
Nariz molhado
2001-11-12 06:42
2002.01.08
Temas para WinXP





afrikaans albanês Arabic armênio azerbaijano basco belarusian Bulgarian catalão Chinês simplificado) Chinês tradicional) croata checo dinamarquês Dutch Inglês estoniano filipino Finnish French
Galego georgiano German grego crioulo haitiano hebraico hindi húngaro islandês Indonesian irlandês Italian Japanese Korean letão lituano macedónio Malay maltês Norwegian
persa polonês Portuguese romeno Russa sérvio Slovak esloveno espanhol swahili sueco tailandês turco ucraniano urdu vietnamita galês ídiche bengali bósnio
cebuano esperanto gujarati hausa hmong igbo javanês kannada khmer lao latino maori marata mongol Nepali punjabi somali tâmil telugu yoruba
zulu
Английский francês Alemão Italiano Португальский russo Espanhol