Yon*_*k64 1 oracle unique-constraint
我有一个包含十几个列的表,但没有为它定义主键。其中存储了几百万行。是否有我可以使用的 SQL 查询返回列的组合,从而为表提供唯一键?它特别是一个 Oracle 数据库。
首先,这似乎是解决问题的错误方式。我将首先调查根据业务规则应该是独一无二的。
不过,您必须研究列组合的幂集。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)
如果不存在行,则列组合是键的候选者。只需验证此组合的任何子集都不是候选者。
| 归档时间: |
|
| 查看次数: |
2110 次 |
| 最近记录: |