Estou importando arquivos simples de diferentes fontes para tabelas no SQL Server. Estou criando uma chave primária composta usando uma combinação de campos das extrações que me fornecerão uma chave exclusiva para cada linha.
A maneira como faço agora é começar com 1 campo e continuar concatenando os campos até encontrar uma chave exclusiva para todos os registros. Isso pode consumir um pouco de tempo ou posso acabar concatenando mais colunas do que realmente precisava para obter a chave exclusiva.
Existe algum tipo de script SQL que eu possa executar em uma tabela que me forneça o número mínimo de campos (nomes) que eu precisaria concatenar para obter uma chave exclusiva? Portanto, se houver 1 campo na tabela que seja exclusivo para todos os registros, esse 1 nome de campo será retornado. Se eu precisasse concatenar [memberid], [claimid] e [date of service] para obter uma chave exclusiva, esses 3 nomes de campo seriam o resultado do script.
Embora comentários e srutzky ofereçam ótimos conselhos, existe uma ferramenta feita exatamente para a sua situação. O SSIS
Data Profiling Task
destina-se à identificação de chaves primárias em potencial (para várias colunas), além de fornecer muitos outros insights úteis sobre seus dados.Basta criar um novo pacote SSIS, adicionar a tarefa e usar a interface semelhante a um assistente para criar o perfil de seus dados. Crie um novo arquivo de saída em algum lugar onde você possa acessá-lo, selecione
Quick Profile...
e crie o perfil das informações apropriadas do banco de dados e da tabela desejada.Depois de terminar, execute o pacote e retorne ao componente para selecionar
Open Profile Viwer...
e observar todos os dados interessantes! A ferramenta me deu uma correspondência de 96% para uma das minhas tabelas de fatos para um PK de três colunas quando até 7 colunas foram solicitadas para a consideração de chave candidata (não mostrada).Só para deixar claro, eu definitivamente concordo que as regras de negócios devem determinar a exclusividade dos dados... só porque você encontra uma combinação de colunas que se ajusta aos seus dados para exclusividade não significa necessariamente que faça algum sentido. =)
Hum, não é exatamente para isso que serve uma chave primária. Sim, eles identificam exclusivamente cada linha, mas também são a base dos relacionamentos de suporte para tabelas irmãs e filhas.
Não fora do que você já está fazendo, embora talvez de formas ligeiramente diferentes, como possivelmente carregar os dados em uma tabela sem chaves ou índices exclusivos ou restrições exclusivas definidas e, em seguida, tentar criar o PK ou Unique (Index | Constraint) em várias combinações de campos. Em ambos os casos, você provavelmente não deveria estar fazendo isso em primeiro lugar.
Existem alguns problemas com essa abordagem em geral:
FieldA
pode ser único eFieldD
+FieldH
pode ser único. O que então?0x02FB4C97
? Isso é umVARBINARY
ou uma string de bytes hexadecimais? E sobre123456
? Isso é umINT
,BIGINT
,VARCHAR
,DATETIME
(no formato juliano),VARBINARY
(sem a liderança ,0x
mas nãoA
-F
para ajudar a decidir)?NULL
para a exportação específica que você está procurando? Ou que tal comprimentos máximos para colunas de comprimento variável? Que tal um campo de "comentários" que eles estão usando atualmente apenas para um número de 5 dígitos, mas depois começam a usá-lo para comentários reais?Então, isso se resume a: qual é o objetivo real de definir os PKs para começar? O que você está tentando realizar fazendo isso? Existe uma razão pela qual você não apenas adiciona um
IDENTITY
campo e remove duplicatas em todos os campos importados (todos menos oIDENTITY
campo)?Você realmente precisa descobrir mais sobre a verdadeira natureza dos dados primeiro e, em seguida, criar uma tabela para armazenar os dados com chaves e restrições que correspondam a como os dados devem existir, não necessariamente como eles existem.
Não pense que existe um script para isso. Ele precisa ser decidido/definido antes que os dados sejam inseridos. Caso contrário, pode bloquear o funcionamento do seu aplicativo.
Normalmente uma tabela precisa de 1 campo para ser única. Somente se você criar uma tabela para vincular 2 tabelas diferentes (para uma relação N-para-M), precisará das chaves M e N para torná-la única. Há exceções, mas cabe ao designer decidir quais campos compõem a chave exclusiva. Os dados podem crescer e a exclusividade também.
Embora eu concorde com algumas postagens de que as chaves devem ser definidas pelo caso de negócios, isso me parece ser a visão da perspectiva de um administrador de banco de dados.
Do ponto de vista da análise de dados, onde você pode enfrentar um conjunto de dados estáticos que deseja analisar, essas combinações de teclas podem ser interessantes e úteis. Imagine uma situação em que você encontrou um subconjunto de dados e está se perguntando quais são os campos-chave que o determinam. Por exemplo, vamos supor que você encontrou um subconjunto de pedidos para alguma combinação de produtos e se pergunta quais são os parâmetros que melhor definem esses pedidos.
Claro que você pode defini-los por seus IDs de pedido, mas pode haver uma combinação de teclas menor e mais interessante, como a idade do cliente e a hora em que o pedido foi feito.
Esse é um problema típico de agrupamento/classificação.