【问题标题】:PK and FK finding algorithm [closed]PK和FK查找算法[关闭]
【发布时间】:2019-01-07 14:17:24
【问题描述】:

如何编写算法来查找关系的主键和外键? 给定参数是关系名称、关系程度和属性数组(主键可能包含多个属性)

我认为如果一个属性被引用而不是主键。并且引用的属性是FK

【问题讨论】:

  • 您好,欢迎来到 SO。我会敦促您阅读这个问题并问问自己是否知道您想在这里问什么。
  • 好的,让我们先从你尝试了什么开始?
  • 这并没有增加这里的清晰度。我怀疑这并不难回答,但我们不知道问题是什么。 This 可能是个不错的起点。
  • 如果表是用 pk 和 fk 定义的,那么您确实知道涉及哪些列。您查看 sys.indexes 和 sys.foreign_keys 和 sys.foreign_key_columns。你的问题根本不清楚。
  • 这是家庭作业吗

标签: sql-server database algorithm primary-key


【解决方案1】:

我会列出一个不包含冗余且不包含空单元格的列作为可能的主键。我想检测它们的一种快速方法是尝试将列声明为 PK 并查看是否存在错误。另一种方法是分组:

select column_name, count(*) c from table_name
where column_name is not null
group by c
having c <> 1

如果table_name 中的column_name 可能是主键,则上面的查询应该不会产生任何行。

至于外键,试试这个:

select column_name from table_name
except
select other_column from other_table

如果other_columnother_tablecolumn_nametable_name 作为外键,这应该返回一个空集。

至于对所有表及其每列自动执行上述测试,我无能为力,因为我的 SQL 词汇表不包括 Microsoft。

请注意,通过上述测试是列成为键的必要条件但不是充分条件。确定哪些列应该是键与算法一样是直觉问题,如果您的出发点是处理杂乱的原始数据集合,则可能有列未通过测试,但仍然应该是键。

【讨论】:

  • @Estheralda,这些查询都不能给出正确答案,因为它们只检查数据。唯一正确的算法是基于数据库约束或依赖关系的算法。从 SQL Server 中的约束中识别 PK 和 FK 非常简单:使用 sys.key_constraints 和 sys.foreign_keys 表。
猜你喜欢
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
相关资源
最近更新 更多