【发布时间】:2018-06-24 21:34:02
【问题描述】:
出于多种原因,您会想知道哪些列使表格独一无二。当您的表具有实际 PK 或只有几列时,这很容易做到。
但是,在这种情况下,我得到了很多没有指定任何数据类型的大表(50 多列),因此没有键。 有一些选项可以获取此信息;使用特定工具解析表或简单地询问表的所有者/创建者复合键是什么。 这可以证明是一个缓慢的过程。 我想看看我是否可以确定具有存储过程的表的复合键是什么。
我确定每张桌子都必须有一个。这是因为每个表中的每一行都是唯一的。
我在谷歌上花了一些时间在这件事上,但我只遇到了制作复合键等的方法。或者用复合键列出表的方法(仅当它们已经定义时)。
基本上我要创建的是一个 SP,它接受一个表名并返回我可以变成复合键的列。
谁能指出我正确的方向,因为我现在有点迷茫。 我在这个项目中使用的是 SQL Server 2014。
【问题讨论】:
-
复合键是否定义了,还是需要从数据中算出来?因为如果它已定义,您只需要检查一些系统表,如 sys.indexes 和 sys.index_columns。如果您需要从数据中找出答案,您可能需要编写大量测试。您使用的是什么版本的 sql server?
-
key没有定义,需要自己从数据中找出来。这就是其中棘手的部分。目前我使用的是 SQL Server 2014。我也在寻找问题背后的逻辑。
-
我的想法是对每个可能的列组合使用 count(distinct),直到找到结果为 count(*) 的组合。当然,手动执行此操作会非常慢,但可以使用动态 SQL 将其自动化,从 sys.columns 中的数据构建查询。我不知道这是否是最好的方法,但这是我现在唯一能想到的方法。我目前没有时间为此创建代码示例,所以我还没有将其作为答案发布。
-
逻辑?取所有合适的列 ([[n]var]char(not max), int),取所有这些的全部或部分组合,选择记录数,按部分列集分组 - 如果记录数相同,你有唯一设置。
-
@ZoharPeled - 以问题中的示例为例。有 50 多列,并且可能需要 1 列和全部 50 列之间的任何位置来创建密钥。要测试的组合数量惊人(2^50)
标签: database tsql stored-procedures sql-server-2014 etl