2013-03-20 9 views
6

In uno scenario ipotetico, sono un utente senza privilegi di creazione di tabelle. Voglio sapere se una colonna in una tabella ha UNICO CONSTRAINT. È possibile cercarlo nel DIZIONARIO? Come potrei farlo?Trova se una colonna ha un vincolo univoco

risposta

5

Entrambe le risposte fornite qui mancano di un modo per far rispettare l'unicità su una colonna: creando un indice univoco (senza definire un vincolo univoco sulla colonna). Vedere questi due collegamenti (one, two) se non si ha familiarità con questa opzione.

Questo controllo deve essere eseguito inoltre al unico vincolo CHECK:

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

Per verificare la presenza di un vincolo univoco utilizzare il metodo già previsto:

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

In alternativa si può anche guardare in le viste ALL_CONSTRAINTS e ALL_IND_COLUMNS.

5

per vincoli particolari che è possibile fare qualcosa di simile:

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; 

impostare il proprietario, tabella e la colonna di interesse e vi mostrerà tutti i vincoli che coprono quella colonna

Si noti che questo non lo farà mostra tutti i casi in cui esiste un indice univoco su una colonna (poiché è possibile avere un indice univoco in atto senza che sia presente un vincolo).

esempio:

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

Table created. 

ora Lista tutti i vincoli che coprono 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 
+0

Questa risposta non verifica la presenza di indici univoci - vedere la mia risposta per i dettagli;). – SebastianH

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

Se count = 0, allora non c'è UNIQUE vincolo resto c'è UNIQUE vincolo sulla vostra tavola.

+0

Questa risposta non controlla gli indici univoci - vedi la mia risposta per i dettagli;) – SebastianH

0

Ecco una query che ho appena provato. Essa elenca ogni vincolo di unicità, identificato da l'indice che fa rispettare, e le colonne che sono uniche:

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; 

Sembra funzionare per le chiavi primarie, indici univoci, e ha aggiunto i vincoli di unicità.