Dúvida Índice Unique

82 views
Skip to first unread message

Thiago Pimenta

unread,
Nov 22, 2013, 7:43:28 AM11/22/13
to sqlse...@googlegroups.com
Bom dia galera,

Preciso criar uma restrição pra evitar duplicidade de dados em uma tabela.
Exemplo: A coluna A e a coluna B de forma composta não pode se repetir.

O problema é que já existe duplicidade, eu queria tentar uma possibilidade de criar o INDEX UNIQUE sem ter que apagar os registros antigos.

Alguém sabe dizer se tem como criar essa restrição validando a duplicidade dos registros daqui pra frente?

--
Atenciosamente,

Thiago Pimenta
Administrador de Dados SQL Server
(61) 8141-7331



Claudio Wagner

unread,
Nov 22, 2013, 7:50:20 AM11/22/13
to sqlse...@googlegroups.com
Cria uma terceira coluna e faz um INDEX UNIQUE com as três.




2013/11/22 Thiago Pimenta <thiagopi...@gmail.com>

--
 
---
You received this message because you are subscribed to the Google Groups "SQLServerDF" group.
To unsubscribe from this group and stop receiving emails from it, send an email to sqlserverdf...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Fabio Cordeiro alexandre

unread,
Nov 22, 2013, 7:54:06 AM11/22/13
to sqlse...@googlegroups.com
Thiago,

qual a versão do seu SQL? Talvez você consiga utilizar um filtered index com a constraint unique.


--
 
---
You received this message because you are subscribed to the Google Groups "SQLServerDF" group.
To unsubscribe from this group and stop receiving emails from it, send an email to sqlserverdf...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.



--
Fábio Cordeiro Alexandre

Angelo Máximo Moreira Silva

unread,
Nov 22, 2013, 7:57:03 AM11/22/13
to sqlse...@googlegroups.com
Thiago, no momento da criação do index adiciona uma condição NOCHECK, para que o índice desconsidere os registros existentes, passando a valer apenas para novos registros.

Att,
--
Angelo Máximo
MCSA | MCTS | MCITP | MCT | CCSQLA
ang...@gmail.com
http://angmaximo.wordpress.com/

Fabio Cordeiro alexandre

unread,
Nov 22, 2013, 7:57:06 AM11/22/13
to sqlse...@googlegroups.com
Thiago,

falei besteira, desconsidera.
hehehehehehe!!
--
Fábio Cordeiro Alexandre

Thiago Pimenta

unread,
Nov 22, 2013, 8:02:53 AM11/22/13
to sqlse...@googlegroups.com
É a versão 2008.
MTA


Claudio Wagner

unread,
Nov 22, 2013, 8:12:40 AM11/22/13
to sqlse...@googlegroups.com
Thiago,

deixa explicar com eu fiz no meu caso.

Tenho uma tabela com um campo cpf, que não é chave, então tinha registros duplicados e nulos. Eliminei as duplicidades, porém os nulos permaneceram. Então eu criei mais um campo, como no seguinte script:

ALTER TABLE tabela ADD cpf_nulo AS (CASE WHEN cpf IS NULL THEN id ELSE -1 END)
GO
ALTER TABLE tabela
ADD CONSTRAINT UNQ_CPF
UNIQUE (cpf, cpf_nulo)
GO

No meu caso o problema de cpf duplicado deixou de existir.

Abraços.


2013/11/22 Thiago Pimenta <thiagopi...@gmail.com>

Thiago Pimenta

unread,
Nov 22, 2013, 8:14:21 AM11/22/13
to sqlse...@googlegroups.com
Valeu galera,

Antes de usar essa alternativa criando uma nova coluna na tabela estou tentando usar outro recurso IGNORE_DUP_KEY = ON.

Marcos Antonio Felisberto

unread,
Nov 22, 2013, 8:21:29 AM11/22/13
to sqlse...@googlegroups.com
Skull Gato mode on!

"Só os entendedores entenderão"
Enviado via iPhone

Claudio Wagner

unread,
Nov 22, 2013, 8:22:42 AM11/22/13
to sqlse...@googlegroups.com
Tive que fazer isso Marcos Felisberto, era um SQL 2000.


2013/11/22 Marcos Antonio Felisberto <marcos.f...@gmail.com>

Marcos Antonio Felisberto

unread,
Nov 22, 2013, 8:27:52 AM11/22/13
to sqlse...@googlegroups.com
KKKKKKK

Leonardo Pedroso Costa

unread,
Nov 22, 2013, 8:32:06 AM11/22/13
to sqlse...@googlegroups.com
Tiago,
o IGNORE_DUP_KEY não vai te ajudar, ele serve é pra não parar a inserção/atualização dos registros caso o mesmo seja duplicado. Ele só informa e continua a execução.

No seu caso, é o tal NOCHECK mesmo que vai ajudar.

Leonardo Pedroso Costa
DBA SQL Server
Belo Horizonte - MG

Thiago Pimenta

unread,
Nov 22, 2013, 8:35:07 AM11/22/13
to sqlse...@googlegroups.com
Com NOCHECK também não consegui.

Thiago Pimenta

unread,
Nov 22, 2013, 8:36:33 AM11/22/13
to sqlse...@googlegroups.com
ALTER TABLE tabela WITH NOCHECK ADD CONSTRAINT CK_tabela UNIQUE (colunaA, colunaB)

Mensagem 1505, Nível 16, Estado 1, Linha 1
The CREATE UNIQUE INDEX statement terminated because a duplicate key was found for the object name 'dbo.tabela' and the index name 'CK_tabela'. The duplicate key value is (0, 17).
Mensagem 1750, Nível 16, Estado 0, Linha 1
Could not create constraint. See previous errors.
The statement has been terminated.

Leonardo Pedroso Costa

unread,
Nov 22, 2013, 8:45:18 AM11/22/13
to sqlse...@googlegroups.com
Tranquilo,
vou pegar o código aqui e te mostro como funciona. Jazim voltou aqui.

Gustavo Maia

unread,
Nov 22, 2013, 8:45:26 AM11/22/13
to sqlse...@googlegroups.com
Bom dia,

PKs e Uniques não podem ser desabilitadas (apenas CKs e FKs tem essa propriedade). A opção Ignore Dup Key não é para ignorar valores duplicados, mas sim para em casos de inserções e atualizações, os registros duplicados sejam desconsiderados sem reverter toda a instrução. Maiores detalhes em:



Acredito que triggers sejam a única opção sem mexer na tabela. Índices filtrados são uma opção, mas possivelmente você terá que criar uma coluna paramos registros desconsiderados e utilizar essa coluna no índice filtrado.

Como mandam as boas práticas, problemas de qualidade de dados terão de ser tratados cedo ou tarde é a conta virá. Melhor será limpar os dados e criar o índice corretamente. Se isso não puder ser feito rapidamente, crie a trigger para estancar o problema, mas não o deixe esquecido.

[ ]s,


Gustavo
--
Atenciosamente,

Thiago Pimenta
Administrador de Dados SQL Server
(61) 8141-7331

MTA


Reply all
Reply to author
Forward
0 new messages