Renumeração de código

13/08/2019

6

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

Post mais votado

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

Responder

Mais Posts

13/08/2019

Alex

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 ?
Responder

14/08/2019

Jothaz

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;




Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira