Inquiridor
Preciso criar uma constraint UNIQUE, em uma coluna com dados duplicados

Pergunta
-
Caros amigos,
Estou com um problemão, tenho uma tabela com quase 250.000 registros.
Uma das colunas (coluna: CdCPF_CGC) possui dados em branco e duplicados, preciso que os próximos registros não dupliquem nem recebam dados em branco.
Usei o comando abaixo:
ALTER TABLE Pessoa
WITH NOCHECK
ADD CONSTRAINT unq_CPFCNPJ UNIQUE (CdCPF_CGC)
GO
O erro retornado, foi o erro abaixo:
Mensagem 1505, Nível 16, Estado 1, Linha 3
The CREATE UNIQUE INDEX statement terminated because a duplicate key was found for the object name 'dbo.Pessoa' and the index name 'unq_CPFCNPJ'. The duplicate key value is (121.407.137-61 ).
Mensagem 1750, Nível 16, Estado 0, Linha 3
Could not create constraint. See previous errors.
The statement has been terminated.
Poderiam me ajudar a construir esta constraint?
Muito obrigado.
Todas as Respostas
-
Ronald,
Neste caso não tem como criar este tipo de constraint enquanto existir dados duplicados, pois a partir do momento em que você implementa a regra o SQL Server vai validar todos os dados já existentes na coluna.
Pedro Antonio Galvão Junior [MSc. | MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
Olá Ronald,
Alguma novidade sobre a consulta feita?
A resposta fornecida foi útil?
Obrigado por usar os fóruns do MSDN.
Pablo Garcia
____________________________
Por favor, lembre-se de "Marcar respostas" para respostas que resolveram seu problema, é uma maneira comum de reconhecer aqueles que ajudaram e torna mais fácil para outros visitantes encontrarem a solução mais tarde.
Se você tiver algum elogio ou reclamação sobre o suporte do MSDN, sinta-se à vontade para entrar em contato com MSDNFSF@microsoft.com -
-
Ronald,
Sim, eu entendi, mas neste caso a sua tabela já contem os dados duplicados.
Neste caso o primeiro passo a fazer é remover uma das linhas de registros duplicados e depois criar a regra.
Veja o exemplo abaixo:
-- Criando a Tabela --
Create Table Clientes
(CodigoCliente Int Primary Key Identity(1,1),
NomeCliente Varchar(80) Not Null,
RGCliente Int Not Null)
Go
-- Inserindo --
Insert Into Clientes (NomeCliente, RGCliente)
Values ('Pedro',123456789),
('João Pedro',123456788),
('Eduardo',123456393),
('Fernanda',123445712),
('Maria Luíza',123456789)
Go
-- Identificando registros duplicados --
Select Row_Number() Over (Partition By RGCliente Order By RGCliente) As Duplicados, RGCliente
From Clientes
Go
------ Aqui você vai ter que verificar o que vai fazer, se vai remover todos os registros duplicados, se vai enviar para outra tabela, enfim --
-- Removendo os registros duplicados --
;With CTEDuplicados (Duplicados, RGCliente)
As
(
-- Identificando registros duplicados --
Select Row_Number() Over (Partition By RGCliente Order By RGCliente) As Duplicados, RGCliente From Clientes
)
Delete From CTEDuplicados
Where Duplicados >=2
Go
-- Consultando --
Select * From Clientes
Go
-- Criando a Constraint --
Alter Table Clientes
Add Constraint [UQ_RGClientes] Unique (RGCliente)
GoPedro Antonio Galvão Junior [MSc. | MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
Olá Ronald,
Alguma novidade sobre a consulta feita?
A resposta fornecida foi útil?
Obrigado por usar os fóruns do MSDN.
Pablo Garcia
____________________________
Por favor, lembre-se de "Marcar respostas" para respostas que resolveram seu problema, é uma maneira comum de reconhecer aqueles que ajudaram e torna mais fácil para outros visitantes encontrarem a solução mais tarde.
Se você tiver algum elogio ou reclamação sobre o suporte do MSDN, sinta-se à vontade para entrar em contato com MSDNFSF@microsoft.com