CRIAR CHAVE PRIMARIA EM TABELA EXISTENTE

 Tópico anterior Próximo tópico Novo tópico

CRIAR CHAVE PRIMARIA EM TABELA EXISTENTE

SQL / DATABASE

 Compartilhe  Compartilhe  Compartilhe
#483906 - 14/08/2018 11:15:41

WMR2018
BALSAS
Cadast. em:Outubro/2017


Tenho uma tabela que já exite com dados (200 mil registros), sem nenhum tipo de chave

Precisava converter o campo CODIGO para chave primaria e o campo COD_PEDIDO para chave estrangeira

tentei fazer usando a interface do SQL Server Express 2008 e nao aceita (por causa da quantidade de registros)

Como faria essa altera via codigo



Resposta escolhida #483911 - 14/08/2018 11:42:42

OCELOT
SOROCABA
Cadast. em:Março/2012


Você deve ter registros com valores repetidos no campo CODIGO, a quantidade de registros não deveria impedir a criação da chave primária



#483912 - 14/08/2018 12:21:24

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Esse é um exemplo clássico do não uso de boas práticas ao se criar algo. Nos primeiros tempos, pode não ser notado nenhum tipo de problema, mas via de regra, eles virão. E o conserto pode ser muito difícil ou até mesmo impossível de ser aplicado.
E concordo com o OCELOT, a quantidade de registros não deveria impedir de criar uma chave primária, quase que certamente você possui registros com valores duplicados.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#483915 - 14/08/2018 12:46:53

WMR2018
BALSAS
Cadast. em:Outubro/2017


quando faço pelo Management dar o erro:

Não é permitido salvar as alterações. As alterações que você fez requerem as seguintes tabelas sejam deslocadas e recriadas. Foram feitas alterações em uma tabela que não pode ser recriada ou habilitada a opção impedir salvar alterações que exigem a tabela seja recriada.


Entao via SQL fiz:
ALTER TABLE pedidos
ADD CONSTRAINT pk_COD_PEDIDO PRIMARY KEY CLUSTERED (COD_PEDIDO);
go


DAR O ERRO:
Não é possível definir a restrição PRIMARY KEY em coluna anulável na tabela 'pedidos'.

o campo COD_PEDIDO é Int e está como NULL
preciso mudar ele antes para NOT NULL

Como faço isso via SQL, mudar de Null para Not Null




#483916 - 14/08/2018 12:50:17

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Você tem registros na tabela em que o campo "Cod_pedido" contém valor null. Você não pode ter uma chave primária que contenha valor null.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#483918 - 14/08/2018 13:15:03

WMR2018
BALSAS
Cadast. em:Outubro/2017


Última edição em 14/08/2018 13:54:44 por WMR2018

dei um
  SELECT * FROM [cyber_base].[dbo].[pedidos] where COD_PEDIDO is null


Não possui nenhum campo numero
Coloquei em ordem numerica do COD_PEDIDO = 1 ATÉ O COD_PEDIDO= 200000
Todos numerados com seus codigos sem repetir, sem duplicidade e nenhum nulo




#483921 - 14/08/2018 14:10:14

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
select distinct cod_pedido from [cyber_base].[dbo].[pedidos]

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#483927 - 14/08/2018 14:30:46

WMR2018
BALSAS
Cadast. em:Outubro/2017


Última edição em 14/08/2018 14:34:06 por WMR2018

Vamos lá...

Fui no Menu opções > Designer > e marquei "Evitar salvar alterações que exijam recriação de tabela"
Abria a tabela no modo: Designer, e desmaquei o campo NULL
ele disse q iria demorar (200mil registros), começou a salvar.... depois de um tempo deu um erro de tempo limite de alteração excedido
Mudei o timout de 30s para 3000s ai pronto.... campo alterado para NOT NULL

ai rodei o sql
ALTER TABLE pedidos
ADD CONSTRAINT pk_COD_PEDIDO PRIMARY KEY CLUSTERED (COD_PEDIDO);
GO


ai tá dando o erro:
A instrução CREATE UNIQUE INDEX foi encerrada porque foi encontrada uma chave duplicada para o nome de objeto 'dbo.pedidos' e o nome de índice 'pk_COD_PEDIDO'. O valor da chave duplicada é (16307).

ou seja, tenho q eliminar as duplicidades...

ai dou um
SELECT   FROM [cyber_base].[dbo].[pedidos] WHERE COD_PEDIDO = 16307

aparece 2 registros... tento apagar 1 dos 2 e ele nao aceita...
entao para teste apaguei os 2
DELETE   FROM [cyber_base].[dbo].[pedidos] WHERE COD_PEDIDO = 16307


executei novamente o comando de gerar a chave, ele encontrou outra duplicidade.... como sei que são 200mil registros... sei q vao aparece varias duplicidades

A questão agora é, como identificar as duplicidades antes e eliminar somente 1 registro de cada duplicidades (sendo que os campos são preenchidos idênticos)

Encontrar os registros duplicados
Eliminar somente 1 registro dos 2




#483931 - 14/08/2018 17:13:19

OCELOT
SOROCABA
Cadast. em:Março/2012


A seguinte SQL pode ser usada para encontrar e excluir todos os duplicados, deixando só um de cada

WITH CTE AS(
   SELECT [COD_PEDIDO], RN = ROW_NUMBER()OVER(PARTITION BY COD_PEDIDO ORDER BY COD_PEDIDO)
   FROM [cyber_base].[dbo].[pedidos]
)
SELECT * FROM CTE WHERE RN > 1


Se trocar o SELECT * por DELETE ele exclui todos os registros duplicados deixando apenas o primeiro



#483934 - 14/08/2018 17:30:45

WMR2018
BALSAS
Cadast. em:Outubro/2017


Citação:
:
A seguinte SQL pode ser usada para encontrar e excluir todos os duplicados, deixando só um de cada

WITH CTE AS(
   SELECT [COD_PEDIDO], RN = ROW_NUMBER()OVER(PARTITION BY COD_PEDIDO ORDER BY COD_PEDIDO)
   FROM [cyber_base].[dbo].[pedidos]
)
SELECT * FROM CTE WHERE RN > 1


Se trocar o SELECT * por DELETE ele exclui todos os registros duplicados deixando apenas o primeiro


Caraca meu irmão, vc me ajudou demais... matou 2 coelhos com uma paulada só
obg meu brother



#483937 - 14/08/2018 18:09:05

WMR2018
BALSAS
Cadast. em:Outubro/2017


Agora só para finalizar, precisava criar uma chave estrageira que relacionasse as 2 tabelas: PEDIDO e PEDIDO_ITENS pelo campo COD_PEDIDO que ambas tem

entao fiz assim:
ALTER TABLE pedidos_itens    
ADD CONSTRAINT CI_PedidoxPedidoItens FOREIGN KEY (COD_PEDIDO)    
    REFERENCES PEDIDOS (COD_PEDIDO)    
    ON DELETE CASCADE    
    ON UPDATE CASCADE    
;    
GO  

e dar o seguinte erro:
A instrução ALTER TABLE conflitou com a restrição do FOREIGN KEY "CI_PedidoxPedidoItens". O conflito ocorreu no bando de dados "cyber_base", tabela "dbo.pedidos", column 'COD_PEDIDO'.





 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por WMR2018 em 22/08/2018 18:31:41