9

架空のシナリオでは、私はテーブル作成権限のないユーザーです。テーブルの列にUNIQUECONSTRAINTがあるかどうかを知りたい。辞書で調べることはできますか?どうすればいいですか?

4

4 に答える 4

8

ここに示されている両方の回答は、列に一意性を適用する1つの方法を見逃しています。それは、(列に一意の制約を定義せずに)一意のインデックスを作成することです。このオプションに慣れていない場合は、これらの2つのリンク(1、2)を参照してください

このチェックは、一意の制約チェックに加えて実行する必要があります。

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_CONSTRAINTSまたは、ビューを確認することもできALL_IND_COLUMNSます。

于 2015-02-26T10:51:36.567 に答える
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
于 2013-03-20T10:44:35.907 に答える
3
select count(*) cnt 
from user_constraints 
where table_name=your_table_name 
and constraint_type='U';

count = 0の場合、UNIQUE制約はありません。それ以外の場合はUNIQUE、テーブルに制約があります。

于 2013-03-20T11:01:44.877 に答える
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;

主キー、一意のインデックス、および追加された一意性の制約に対して機能するようです。

于 2017-04-04T23:40:15.347 に答える