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
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
.
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
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.
Questa risposta non controlla gli indici univoci - vedi la mia risposta per i dettagli;) – SebastianH
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à.
- 1. Trova un vincolo univoco nella tabella database
- 2. Vincolo univoco per sequenziare la colonna
- 3. vincolo univoco condizionale
- 4. Postgresql: vincolo condizionalmente univoco
- 5. SQL: vincolo univoco quando la colonna è un determinato valore
- 6. Vincolo univoco rispetto all'indice univoco
- 7. controllo vincolo univoco in JPA
- 8. Devo controllare un vincolo univoco con php?
- 9. Modifica vincolo univoco in Oracle
- 10. PostgreSQL: condizionale vincolo univoco
- 11. MongoDB: rimuovere vincolo univoco
- 12. La creazione di un vincolo univoco su una colonna crea automaticamente un indice?
- 13. Oracle trova un vincolo
- 14. Eliminazione del vincolo univoco per la colonna in H2
- 15. Vincolo univoco su più colonne
- 16. Vincolo univoco condizionale in oracle db
- 17. Vincolo univoco in un'architettura RESTFul
- 18. EF6 vincolo univoco estera chiave
- 19. Postgres vincolo univoco vs indice
- 20. Vincolo univoco su più colonne
- 21. Vincolo univoco con annotazione dati
- 22. indice univoco o vincolo sul tasto hstore
- 23. Vincolo univoco Oracle con espressione
- 24. Aggiunta di un vincolo univoco composito in Liquibase
- 25. Vincolo univoco con righe cancellate escluse
- 26. Come assegnare un vincolo univoco a una combinazione di colonne in Oracle?
- 27. Convenzione di denominazione per il vincolo univoco
- 28. Come verificare se un modello ha una determinata colonna/attributo?
- 29. laravel 4 Email di convalida vincolo univoco
- 30. Come creare un vincolo univoco composito in SQL Server 2005
Questa risposta non verifica la presenza di indici univoci - vedere la mia risposta per i dettagli;). – SebastianH