如何编写算法来查找关系的主键和外键? 给定的参数是关系的名称,关系的程度和属性的数组(一个主键可能包含多个属性)
我认为如果引用的属性不是主键。所指的服装是FK
答案 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,因此我无能为力。
请注意,通过以上测试是使列成为键的必要但不充分的条件。与算法相比,确定应为列应该是直觉的问题,并且,如果您的起点是驯服混乱的原始数据集合,则可能有一些列未通过测试,但仍然应该是键。