查找列是否具有唯一约束条件

10
在假设的场景中,我是一个没有表创建权限的用户。我想知道一个表中的某个列是否有唯一约束条件。我能否在字典中查找?我该如何操作?
4个回答

10
这里给出的两个答案都未提到一种确保列唯一性的方法:通过创建一个唯一索引来实现(而不是在列上定义唯一约束)。如果您对此选项不熟悉,请参考以下两个链接(链接一链接二)。

除了检查唯一约束条件之外,还应另外执行此检查:

select count(*) from
USER_IND_COLUMNS cols
where cols.table_name='YOUR_TABLE_NAME'
and cols.COLUMN_NAME='YOUR_COLUMN';

要检查唯一约束,请使用已提供的方法:

select count(*) cnt 
from user_constraints uc
where uc.table_name='YOUR_TABLE_NAME'
and uc.constraint_type='U';

或者您也可以查看ALL_CONSTRAINTSALL_IND_COLUMNS视图。


5

对于唯一约束,你可以这样做:

select cons.constraint_type, 
       all_cols.owner, all_cols.constraint_name, 
       all_cols.table_name, 
       all_cols.column_name, 
       all_cols.position
  from all_cons_columns col
       inner join all_cons_columns all_cols
               on col.owner = all_cols.owner
              and col.constraint_name = all_cols.constraint_name
       inner join all_constraints cons
               on col.owner = cons.owner
              and col.constraint_name = cons.constraint_name
 where col.owner = 'SCHEMA'
   and col.table_name = 'FOO'
   and col.column_name = 'ID'
   and cons.constraint_type in ('U', 'P')
 order by owner, constraint_name, position;

设置感兴趣的所有者、表和列,它将向您显示覆盖该列的所有约束。

注意,这不会显示在列上存在唯一索引的所有情况(因为可能存在唯一索引而没有约束存在的情况)。

示例:

SQL> create table foo(id number, id2 number, constraint foo_con unique(id, id2), constraint foo_con2 unique(id));

Table created.

现在列出所有涵盖id的约束条件:

SQL> col column_name format a20
SQL> col constraint_name format a20
SQL> col table_name format a15
SQL> select cons.constraint_type,
  2         all_cols.owner, all_cols.constraint_name,
  3         all_cols.table_name,
  4         all_cols.column_name,
  5         all_cols.position
  6    from all_cons_columns col
  7         inner join all_cons_columns all_cols
  8                 on col.owner = all_cols.owner
  9                and col.constraint_name = all_cols.constraint_name
 10         inner join all_constraints cons
 11                 on col.owner = cons.owner
 12                and col.constraint_name = cons.constraint_name
 13   where col.owner = user
 14     and col.table_name = 'FOO'
 15     and col.column_name = 'ID'
 16     and cons.constraint_type in ('U', 'P')
 17   order by owner, constraint_name, position;

C OWNER                          CONSTRAINT_NAME      TABLE_NAME      COLUMN_NAME            POSITION
- ------------------------------ -------------------- --------------- -------------------- ----------
U DTD_TRADE                      FOO_CON              FOO             ID                            1
U DTD_TRADE                      FOO_CON              FOO             ID2                           2
U DTD_TRADE                      FOO_CON2             FOO             ID                            1

此答案未检查唯一索引 - 请参阅我的答案以获取详细信息 ;)。 - SebastianH

3
select count(*) cnt 
from user_constraints 
where table_name=your_table_name 
and constraint_type='U';

如果计数为0,则表中没有 UNIQUE 约束;否则,在您的表上存在 UNIQUE 约束。

此答案未检查唯一索引 - 请参阅我的答案以获取详细信息 ;) - SebastianH

0

这里是我刚尝试的一个查询。它列出了每个唯一性约束,由强制执行它的索引和唯一的列组成:

select x.index_name, c.column_name, c.column_position
from USER_INDEXES x join USER_IND_COLUMNS c
     on x.index_name = c.index_name and x.table_name = c.table_name
     left join USER_CONSTRAINTS uc
     on x.index_name = uc.index_name and x.table_name = uc.table_name
where x.status = 'VALID' and
      (x.uniqueness = 'UNIQUE' or
       uc.constraint_type = 'U' and uc.status = 'ENABLED' and uc.validated = 'VALIDATED')
      and x.table_name='<your table name_in_caps>'
order by x.index_name, c.column_position;

它似乎适用于主键、唯一索引和添加的唯一性约束。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接