PK和FK查找算法

时间:2019-01-07 14:17:24

标签: sql-server database algorithm primary-key

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

我认为如果引用的属性不是主键。所指的服装是FK

1 个答案:

答案 0 :(得分:0)

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

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

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

对于外键,请尝试以下操作:

select column_name from table_name
except
select other_column from other_table

如果other_column的{​​{1}}具有other_table的{​​{1}}作为外键,则应该返回一个空集。

对于在所有表及其每个列上进行上述测试的自动化,由于我的SQL词汇表不包含Microsoft,因此我无能为力。

请注意,通过以上测试是使列成为键的必要但不充分的条件。与算法相比,确定应为列应该是直觉的问题,并且,如果您的起点是驯服混乱的原始数据集合,则可能有一些列未通过测试,但仍然应该是键。