2014-11-20 2 views
5

У меня есть столбец varchar в моей таблице для значения URL. Я должен сделать его уникальным по всей записи без учета регистра. Я нашел 2 способа его достижения.Уникальное ограничение нечувствительности к регистру в базе данных оракулов

  1. Создайте уникальный указатель на поле.

    create unique index <index_name> on <tablename>(lower(<column_name>)) 
    
  2. Добавить уникальное ограничение на поле

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

Что такое эффективный способ принять из вышеупомянутых вариантов?

+1

Это довольно всеобъемлющее объяснение различия, без комментариев явно на эффективность : http://stackoverflow.com/a/7522004/110933 – davek

+1

Уникальное ограничение использует уникальный индекс под капотом, между ними нет разницы, единственное отличие - синтаксис. – krokodilko

+2

Я бы предпочел ограничение; разница в семантике. Будущий разработчик мог бы рассмотреть ограничение как форму документации: «это должно быть нечувствительным к регистру уникальным». Уникальный индекс, OTOH, может быть истолкован как просто созданный для целей производительности: «этот столбец всегда не чувствителен к регистру» –

ответ

9

Более эффективный подход - это первый подход. Это более эффективно, но только потому, что последний синтаксис не работает. Вы, к сожалению, не можете создать ограничение на основе функций так же, как вы можете создать уникальный индекс.

Уникальное ограничение не работает

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 

Уникальный индекс функции на основе, однако, не работает

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

Index created. 
+0

Спасибо, поэтому, если мы создадим уникальный функциональный индекс, нам не нужно/нам не следует добавлять уникальное ограничение на столбец? – user1116119

+0

@ user1116119 - Вы не можете создать уникальное ограничение на значение функции, просто уникальный индекс на основе функций. В зависимости от вашей версии Oracle вы также можете создать вычисляемый столбец, который является «lower (first_name)», и создать для него уникальное ограничение. –

Смежные вопросы