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 no deveria impedir a criao da chave primria



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

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


Membro da equipe
Esse um exemplo clssico do no uso de boas prticas ao se criar algo. Nos primeiros tempos, pode no ser notado nenhum tipo de problema, mas via de regra, eles viro. E o conserto pode ser muito difcil ou at mesmo impossvel de ser aplicado.
E concordo com o OCELOT, a quantidade de registros no deveria impedir de criar uma chave primria, quase que certamente voc possui registros com valores duplicados.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


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

WMR2018
BALSAS
Cadast. em:Outubro/2017


quando fao pelo Management dar o erro:

No permitido salvar as alteraes. As alteraes que voc fez requerem as seguintes tabelas sejam deslocadas e recriadas. Foram feitas alteraes em uma tabela que no pode ser recriada ou habilitada a opo impedir salvar alteraes 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:
No possvel definir a restrio PRIMARY KEY em coluna anulvel na tabela []pedidos[].

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

Como fao 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[] contm valor null. Voc no pode ter uma chave primria que contenha valor null.

_______________________________________________________________________
Virei Orculo!
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


No 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]

_______________________________________________________________________
Virei Orculo!
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 opes > Designer > e marquei []Evitar salvar alteraes que exijam recriao de tabela[]
Abria a tabela no modo: Designer, e desmaquei o campo NULL
ele disse q iria demorar (200mil registros), comeou a salvar.... depois de um tempo deu um erro de tempo limite de alterao 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 instruo 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 so 200mil registros... sei q vao aparece varias duplicidades

A questo agora , como identificar as duplicidades antes e eliminar somente 1 registro de cada duplicidades (sendo que os campos so preenchidos idnticos)

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 irmo, 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 instruo ALTER TABLE conflitou com a restrio 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