通过SQL代码识别主键候选者

时间:2014-12-23 11:18:45

标签: sql sql-server primary-key

我有一个包含数百万行且没有约束的原始数据,我想通过SQL代码识别主键的唯一列。

我们有什么方法可以通过SQL代码识别主键候选者吗?

5 个答案:

答案 0 :(得分:9)

您可以尝试以下查询

select count(<potential_column>),count(distinct <potential column>) from <table>

当计数匹配时,您有一个候选键供考虑。

例如,如果我有一个名为PEOPLE的人员表,我可能会做类似的事情。

select 'FullName' as FldName, count(fullname) as Tot,count(distinct fullName) as TotD 
from People
union
select 'SSN' as FldName, count(SSN) as Tot,count(distinct SSN) as TotD 
from People

这将返回两行,显示字段名称和计数。 tot 匹配 totd 的任何行都是候选者,尽管在此示例中,我依赖于基于数据知识的SSN(社会安全号码)。

您可以使用连接字段运行相同的查询,例如

  select 'First/Last' as FldName, count(Firstname+lastName) as Tot,
          count(distinct firstname+LastName) as TotD 
    from People

如果你正在寻找复合键,虽然试图决定连接哪些字段需要更好地理解你的数据

答案 1 :(得分:1)

尽管可以(根据答案和评论)检测表中现有数据的排列是否唯一,但在任何不明确的情况下都有明显的表中的自然或现有代理键,而不是通过猜测或推断数据的唯一性来尝试从数据中的一个或多个aribtrary列创建pseudo primary key,而是创建一个新的代理主键,例如IDENTITY整数或UNIQUEIDENTIFIER

<强>原理

  • 我们设计它是独一无二的,而不是希望它将继续是独一无二的。例如,日期时间/时间戳有一种不独特的讨厌习惯。
  • 我们会适当地命名列,以便其他人立即将其识别为主键
  • 它可能比由其他随机列组成的复合键更窄

答案 2 :(得分:1)

如果一个表有10个不可为空的列,那么它有1024个可能的属性集(=幂集),其中任何一个都可能是键。你真的想测试所有这些吗?

确定密钥的唯一谨慎和可靠的方法来自第一原则:基于对数据应该代表什么的理解来分析您的业务需求。如果没有这种分析和理解,您如何知道您的数据是否是可靠,准确的样本,从中推断出合适的密钥?如果表格在过去没有对其强制执行任何关键约束,那么它可能已包含错误的重复数据。

答案 3 :(得分:0)

您可以使用以下代码生成表的唯一列列表:

DECLARE
     @TableSchema sysname = 'dbo'
    ,@TableName sysname = 'Task'
    ,@ColumnName sysname=''
    ,@sql nvarchar(max)=''
;
---
DECLARE c CURSOR FOR (SELECT [COLUMN_NAME] FROM [INFORMATION_SCHEMA].[COLUMNS] WHERE [TABLE_SCHEMA] = @TableSchema AND [TABLE_NAME] = @TableName);
OPEN c;
FETCH NEXT FROM c INTO @ColumnName;
WHILE @@FETCH_STATUS = 0 BEGIN
    SET @sql += 'SELECT '''+@ColumnName+''' FROM '+QUOTENAME(@TableSchema)+'.'+QUOTENAME(@TableName)+' HAVING COUNT(*)=COUNT(DISTINCT '+QUOTENAME(@ColumnName)+')';
    FETCH NEXT FROM c INTO @ColumnName;
    IF @@FETCH_STATUS = 0 SET @sql += 'UNION ALL ';
END;
CLOSE c;
DEALLOCATE c;
EXEC SP_EXECUTESQL @sql;
---

这不一定是选择主键的最佳方式,除非您可以保证该列将来不会有重复项。但是,在分析数据集以发现哪些列倾向于包含唯一值时,此代码非常有用。

答案 4 :(得分:0)

如何使用sp_special_columns查找唯一性?它看起来(来自Googling)这个sproc旨在找到唯一性,sp_special_columns的MSFT定义:“返回唯一标识表中行的最佳列集。还返回当行中的任何值更新时自动更新的列一笔交易。“