Renumeração de código
Boa tarde galera
Minha duvida e a seguinte:
Tenho uma tabela que sua coluna código, ficou fora de ordem, antes estava
1
2
3...
depois eu apaguei uma numeração, 5 números, 20 ao 25, quando vou criar outros código, ele pula esses números, continua 26, 27...
Gostaria de saber no sql server, como fazer uma renumeração novamente, para voltar a sequencia numérica.
É uma tabela de teste, no momento ela não esta amarrada e nenhuma outra.
Minha duvida e a seguinte:
Tenho uma tabela que sua coluna código, ficou fora de ordem, antes estava
1
2
3...
depois eu apaguei uma numeração, 5 números, 20 ao 25, quando vou criar outros código, ele pula esses números, continua 26, 27...
Gostaria de saber no sql server, como fazer uma renumeração novamente, para voltar a sequencia numérica.
É uma tabela de teste, no momento ela não esta amarrada e nenhuma outra.
Alexsandre Sales
Curtidas 0
Melhor post
Jothaz
13/08/2019
Você esta usando um campo do tipo IDENTITY que é gerado e incrementado automaticamente pelo motor do banco de dados. E quando exclui-se valores ele sempre irá iniciar na sequência, justamente para evitar repetir valores, pois a ideia é ter-se um identificador único.
SÓ EXECUTE O COMANDO ABAIXO APÓS LER TODO O POST, você pode reiniciar o IDENTITY de um determinado número, no seu caso seria:
Só que isto não é um boa prática, pois quebra a ideia de identificadores únicos, além do que se você excluísse de 10 a 15, ao executar o comando influenciaria na sequencia.
Então muito cuidado ao utilizar o comando acima.
Uma forma de contornar este problema seria criar um campo ID do tipo IDENTITY com auto-incremento e outro campo CODIGO que você incrementa manualmente.
Um exemplo simples só ilustrativo:
Resultado:
SÓ EXECUTE O COMANDO ABAIXO APÓS LER TODO O POST, você pode reiniciar o IDENTITY de um determinado número, no seu caso seria:
DBCC CHECKIDENT ('Person.AddressType', RESEED, 20);
Só que isto não é um boa prática, pois quebra a ideia de identificadores únicos, além do que se você excluísse de 10 a 15, ao executar o comando influenciaria na sequencia.
Então muito cuidado ao utilizar o comando acima.
Uma forma de contornar este problema seria criar um campo ID do tipo IDENTITY com auto-incremento e outro campo CODIGO que você incrementa manualmente.
Um exemplo simples só ilustrativo:
declare @temp table (id int identity, codigo int) insert into @temp values (1) insert into @temp values ((select max(codigo)+1 from @temp)) insert into @temp values ((select max(codigo)+1 from @temp)) insert into @temp values ((select max(codigo)+1 from @temp)) insert into @temp values ((select max(codigo)+1 from @temp)) select * from @temp
Resultado:
id codigo ----------- ----------- 1 1 2 2 3 3 4 4 5 5
GOSTEI 2
Mais Respostas
Alexsandre Sales
13/08/2019
Entendi, mas estou conhecendo ainda o sql server, estou podemos dizer brincando com as tabelas e conhecendo os comando que são diferente do postgres
Obrigado pela explicação e essa ideia
Mais uma ajuda agora, essa ja e manipulação de tabela também, mas seria burlando o sistema rsrsrsr
tem como fazer um randonumber ou row_number nessa coluna codigo?
tipo tenho 100 registro, so que deixei tudo fora de ordem, ai queria so reorganizar esses numeros
qual que usaria no sql server ?
Obrigado pela explicação e essa ideia
Mais uma ajuda agora, essa ja e manipulação de tabela também, mas seria burlando o sistema rsrsrsr
tem como fazer um randonumber ou row_number nessa coluna codigo?
tipo tenho 100 registro, so que deixei tudo fora de ordem, ai queria so reorganizar esses numeros
qual que usaria no sql server ?
GOSTEI 0
Jothaz
13/08/2019
Só para contextualizar o SQL foi desenvolvido na década de 70 pela IBM dentro do projeto System R (ou algo assim) e tinha como objetivo principal demonstrar a viabilidade do uso do modelo relacional.
Devido a sua facilidade de uso e simplicidade tornou-se padrão para uso de banco de dados.
Com o tempo outros desenvolvedores agregaram outros "sabores" ao SQL, modificando e melhorando o que foi originalmente criado pela IBM.
Então American National Standards Institute (ANSI) entrou no circuito para criar um padrão para justamente facilitar o uso e aprendizagem.
isto foi feito por volta de 1986 e revisto em 1992 e 2003 (se não me engano).
Então todos os motores de banco de dados: SQL Server, Oracle, PostgreSQL, MariaDB e outros, usam este padrão, contudo agregam outras features especificas para cada motor.
Por isso temos diferenças significativas em cada BD.
Só que todos suportam o padrão ANSI o que torna o SQL universal, a base do SQL sempre será a mesma o que muda são especificidades de cada motor.
Não entendi sua pergunta, mas sou lerdo mesmo!
Todavia existem algumas formas de gerar códigos randômicos e para ordenar basta usar ORDER BY.
Usando NEWID():
Usando RAND():
Usando ROW_NUMBER():
Devido a sua facilidade de uso e simplicidade tornou-se padrão para uso de banco de dados.
Com o tempo outros desenvolvedores agregaram outros "sabores" ao SQL, modificando e melhorando o que foi originalmente criado pela IBM.
Então American National Standards Institute (ANSI) entrou no circuito para criar um padrão para justamente facilitar o uso e aprendizagem.
isto foi feito por volta de 1986 e revisto em 1992 e 2003 (se não me engano).
Então todos os motores de banco de dados: SQL Server, Oracle, PostgreSQL, MariaDB e outros, usam este padrão, contudo agregam outras features especificas para cada motor.
Por isso temos diferenças significativas em cada BD.
Só que todos suportam o padrão ANSI o que torna o SQL universal, a base do SQL sempre será a mesma o que muda são especificidades de cada motor.
Não entendi sua pergunta, mas sou lerdo mesmo!
Todavia existem algumas formas de gerar códigos randômicos e para ordenar basta usar ORDER BY.
Usando NEWID():
DECLARE @TEMP TABLE ( ID UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(), NOME VARCHAR (50) ) INSERT INTO @TEMP VALUES (DEFAULT,''VOLTARIRE'') INSERT INTO @TEMP VALUES (DEFAULT,''SPINOZA'') INSERT INTO @TEMP VALUES (DEFAULT,''PASCAL'') INSERT INTO @TEMP VALUES (DEFAULT,''SCHOPENHAUER'') SELECT * FROM @TEMP ORDER BY ID
Usando RAND():
DECLARE @TEMP TABLE ( ID float, NOME VARCHAR (50) ) INSERT INTO @TEMP VALUES ( (rand()*10),''VOLTARIRE'') INSERT INTO @TEMP VALUES ( (rand()*10),''SPINOZA'') INSERT INTO @TEMP VALUES ( (rand()*10),''PASCAL'') INSERT INTO @TEMP VALUES ( (rand()*10),''SCHOPENHAUER'') SELECT * FROM @TEMP ORDER BY ID
Usando ROW_NUMBER():
DECLARE @TEMP TABLE ( NOME VARCHAR (50) ) INSERT INTO @TEMP VALUES (''VOLTARIRE'') INSERT INTO @TEMP VALUES (''SPINOZA'') INSERT INTO @TEMP VALUES (''PASCAL'') INSERT INTO @TEMP VALUES (''SCHOPENHAUER'') SELECT ROW_NUMBER() OVER(ORDER BY NOME ASC) AS ROW#, NOME FROM @TEMP ORDER BY NOME DESC;
GOSTEI 0
Alexsandre Sales
13/08/2019
Boa noite, deu para entender algumas coisa
Mas nesse momento nao sei se é porque estou com sono ou fiquei com leve problema mental....kkkk
Mas me ajudem aqui nessa query
Quando executo ela, ela nao esta fazendo o loop certo, ela executou na mesma linha, reparem que o id de 1 foi para 1548
no caso era para ter dado continuidade em cada linha 1+1.
ja agradeço pq agora vou dormir uns 5 dias...
loja_id material_id nu_codig
0 1 1548
0 2 2
0 3 3
0 4 4
Mas nesse momento nao sei se é porque estou com sono ou fiquei com leve problema mental....kkkk
Mas me ajudem aqui nessa query
Quando executo ela, ela nao esta fazendo o loop certo, ela executou na mesma linha, reparem que o id de 1 foi para 1548
no caso era para ter dado continuidade em cada linha 1+1.
ja agradeço pq agora vou dormir uns 5 dias...
declare @n int set @n = 0 set rowcount 1 while exists(select * from material where classe_abc is null) begin update material set nu_codigo = @n set @n = @n + 1 end set rowcount 0
loja_id material_id nu_codig
0 1 1548
0 2 2
0 3 3
0 4 4
GOSTEI 0
Emerson Nascimento
13/08/2019
acredito que seja disso que você precisa:
update m set m.nu_codigo = m2.new_codigo from material m inner join (select nu_codigo, ROW_NUMBER() over(order by nu_codigo) new_codigo from material) m2.nu_codigo = m.nu_codigo
GOSTEI 0
Emerson Nascimento
13/08/2019
na verdade teve um pequeno erro na transcrição da instrução:
update m set m.nu_codigo = m2.new_codigo from material m inner join (select nu_codigo, ROW_NUMBER() over(order by nu_codigo) new_codigo from material) m2 on m2.nu_codigo = m.nu_codigo
GOSTEI 0