2014-11-20 8 views
5

Ho una colonna varchar nella tabella per il valore dell'URL. Devo renderlo unico in tutti i casi, in modo insensibile. Ho trovato 2 modi per realizzarlo.Vincolo non sensibile alle maiuscole/minuscole nel database Oracle

  1. Creare un indice univoco sul campo.

    create unique index <index_name> on <tablename>(lower(<column_name>)) 
    
  2. aggiungere un vincolo unico sul campo come

    ALTER TABLE person ADD CONSTRAINT person_name_unique 
    UNIQUE(LOWER(first_name),LOWER(last_name)); 
    

Qual è il modo efficace per adottare le scelte di cui sopra?

+1

Questa è una spiegazione abbastanza completa della differenza, senza commentare esplicitamente l'efficienza : http://stackoverflow.com/a/752200/110933 – davek

+1

Un vincolo univoco utilizza un indice univoco sotto il cofano, non c'è differenza tra di essi, l'unica differenza è la sintassi. – krokodilko

+2

Preferirei il vincolo; la differenza è nella semantica. Uno sviluppatore futuro potrebbe considerare il vincolo come una forma di documentazione: "questo deve essere univoco senza distinzione tra maiuscole e minuscole". Un indice univoco, OTOH, potrebbe essere interpretato come meramente creato a fini di prestazioni: "questa colonna sembra essere sempre insensibile alle maiuscole e minuscole" –

risposta

9

L'approccio più efficiente è il primo approccio. È più efficiente, però, solo perché la seconda sintassi non funziona. Sfortunatamente, non è possibile creare un vincolo basato sulla funzione nello stesso modo in cui è possibile creare un indice univoco.

Un vincolo univoco non funziona

SQL> create table person (
    2 first_name varchar2(10), 
    3 last_name varchar2(10) 
    4 ); 

Table created. 

SQL> ALTER TABLE person ADD CONSTRAINT person_name_unique 
    2 UNIQUE(LOWER(first_name),LOWER(last_name)); 
UNIQUE(LOWER(first_name),LOWER(last_name)) 
     * 
ERROR at line 2: 
ORA-00904: : invalid identifier 

Un indice basato su una funzione unica, tuttavia, funziona

SQL> create unique index idx_uniq_name 
    2  on person(lower(first_name), lower(last_name)); 

Index created. 
+0

Grazie, quindi, se creiamo un indice basato su una funzione univoca, non è necessario/non dovremmo aggiungere un vincolo univoco sulla colonna? – user1116119

+0

@ user1116119 - Non è possibile creare un vincolo univoco sul valore della funzione, ma solo un indice basato su una funzione univoca. A seconda della versione di Oracle, dovresti anche essere in grado di creare una colonna calcolata che sia 'lower (first_name)' e creare un vincolo univoco su quello. –

Problemi correlati