Renumeração de código

SQL Server

SQL

13/08/2019

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.
Alexsandre Sales

Alexsandre Sales

Curtidas 0

Melhor post

Jothaz

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:
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

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 ?
GOSTEI 0
Jothaz

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():

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

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...

 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

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

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
POSTAR