我正在将来自不同来源的平面文件导入 SQL Server 中的表中。我正在使用提取中的字段组合创建一个复合主键,这将为我提供每一行的唯一键。
我现在的做法是从 1 个字段开始,然后继续连接字段,直到找到一个对所有记录都是唯一的键。这可能会有点耗时,或者我最终可能会连接比我真正需要的更多的列来获取唯一键。
是否有某种 SQL 脚本可以在表上运行,它可以为我提供最少数量的字段(名称),我需要连接以获得唯一键?因此,如果表中有 1 个字段对所有记录都是唯一的,则将返回该 1 个字段名称。如果我需要连接 [memberid]、[claimid] 和 [date of service] 以获得唯一键,那么这 3 个字段名称将是脚本的结果。
虽然评论和 srutzky 提供了一些很好的建议,但有一个工具完全适合您的情况。SSIS
Data Profiling Task
旨在识别潜在的主键(用于多列),同时为您的数据提供许多其他有用的见解。只需创建一个新的 SSIS 包,添加任务,然后使用类似向导的界面来分析您的数据。在您可以访问的地方创建一个新的输出文件,
Quick Profile...
然后从所需的数据库和表中选择并分析适当的信息。完成后运行包并返回组件以选择
Open Profile Viwer...
并查看所有令人兴奋的数据!当请求多达 7 列作为候选键考虑(未显示)时,该工具为我的一个三列 PK 事实表提供了 96% 的匹配。为了清楚起见,我绝对同意业务规则应该确定数据的唯一性......仅仅因为您找到适合您的数据的列组合以实现唯一性并不一定意味着它有任何意义。=)
嗯,这不完全是主键的用途。是的,它们确实唯一标识每一行,但它们也是支持同级表和子表的关系的基础。
不在您已经在做的事情之外,尽管形式可能略有不同,例如可能将数据加载到没有定义键或唯一索引或唯一约束的表中,然后尝试创建 PK 或唯一(索引 | 约束)关于各种领域的组合。在任何一种情况下,您可能一开始都不应该这样做。
一般来说,这种方法存在一些问题:
FieldA
可能是唯一的,FieldD
+FieldH
可能是唯一的。然后怎样呢?0x02FB4C97
?那是一个VARBINARY
还是一串十六进制字节?怎么样123456
?那是INT
,BIGINT
,VARCHAR
,DATETIME
(朱利安格式),VARBINARY
(没有前导0x
但没有A
-F
帮助决定)?NULL
用于您正在查看的特定导出,该怎么办?或者可变长度列的最大长度呢?他们目前仅用于 5 位数字但后来开始将其用于实际评论的“评论”字段呢?所以这归结为:定义 PK 的实际目标是什么?你想通过这样做来完成什么?您是否有理由不只是添加一个
IDENTITY
字段,然后在所有导入的字段中删除重复项(全部减去该IDENTITY
字段)?您确实需要首先更多地了解数据的真实性质,然后构建一个表来保存具有与数据应该如何存在相匹配的键和约束的数据,而不一定是它如何存在。
不要认为有这个脚本。它需要在输入数据之前决定/定义。否则,它可能会阻止您的应用程序运行。
通常一个表需要 1 个字段是唯一的。只有当您创建一个表来链接 2 个不同的表(对于 N 到 M)关系时,您才需要 M 和 N 键来使其唯一。也有例外,但由设计者决定哪些字段构成唯一键。数据可以增长,唯一性也可以增长。
尽管我同意一些帖子,键应该由业务案例定义,但在我看来,这似乎是从数据库管理员的角度来看的观点。
从数据分析的角度来看,您可能面临一个静态数据集,您想要分析这些组合键可能很有趣且有用。想象一下,您发现了一个数据子集,并且想知道决定它的关键字段是什么。例如,假设您找到了某些产品组合的订单子集,并且您想知道最能定义这些订单的参数是什么。
当然,您可以通过它们的订单 ID 来定义它们,但可能会有更小更有趣的组合键,例如客户的年龄和下订单的时间。
这是一个典型的聚类/分类问题。