用于查找为表创建唯一键的一组列的 SQL 查询

Yon*_*k64 1 oracle unique-constraint

我有一个包含十几个列的表,但没有为它定义主键。其中存储了几百万行。是否有我可以使用的 SQL 查询返回列的组合,从而为表提供唯一键?它特别是一个 Oracle 数据库。

Len*_*art 5

首先,这似乎是解决问题的错误方式。我将首先调查根据业务规则应该是独一无二的。

不过,您必须研究列组合的幂集。n 上的幂集的基数是 2^n,但空集可以忽略。因此,如果您有 10 列,这意味着要调查 2^10-1=1023 种组合。使用宿主语言生成 sql 可能最简单,但您可以使用 group by cube 来获取组合。假设列 c1、c2、c3:

  with t(a,b,c) as ( values ('c1','c2','c3') ) 
  select a,b,c 
  from t group by cube (a,b,c)

A  B  C 
-- -- --
-  c2 c3
-  -  c3
-  c2 - 
-  -  - 
c1 c2 - 
c1 -  - 
c1 -  c3
c1 c2 c3
Run Code Online (Sandbox Code Playgroud)

现在你可以通过循环这个结果集来生成 sql:

select c2,c3 from t group by c2,c3 having count(1) > 1
Run Code Online (Sandbox Code Playgroud)

如果不存在行,则列组合是键的候选者。只需验证此组合的任何子集都不是候选者。