Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

Уникальность Case Insensitive   Найти похожие ветки 

 
kaif ©   (2004-04-11 16:21) [0]

Иногда бывает нужно в БД иметь уникальный индекс, который не различал бы регистр букв. Как это лучше всего организовать?


 
Jack128 ©   (2004-04-11 16:31) [1]

добавь поле, заполняемое на тригерах и строй по нему индекс..Или еще вариант перейти на Yaffil, там индексы по udf есть..


 
kaif ©   (2004-04-11 16:57) [2]

2 Jack128 ©   (11.04.04 16:31) [1]
Я использую Yaffil выше версии 877 или Firebird выше 1.5 RC4. В принципе, я видимо могу попробовать воспользоваться вторым советом (еще не экспериментировал с такими индексами). Жаль, однако, что исходный стандарт не предусматривает такую вещь, хотя предусматривает наличие встроенной функции upper. Я стараюсь все время придерживаться минимализма в синтаксисе, чтобы совместимость с IB6.5 была и другими потенциально возможными серверами...


 
Jack128 ©   (2004-04-11 17:12) [3]


> [2] kaif ©   (11.04.04 16:57)
ну первый способ гарантирует совместимость..Хотя, конечно, кривоват..


 
kaif ©   (2004-04-11 17:46) [4]

Интересно...а индекс по вычисляемым полям возможен? Тогда можно было бы создать вычисляемое поле COMPUTED BY, а по нему - индекс. Какая идея!!! Сейчас посмотрю в документации. Наверняка меня обломают какой-нибудь фразой типа: calculated columns cannot be used in the index....


 
Jack128 ©   (2004-04-11 17:57) [5]

даже теоритически недадут создать такой index.
Дапустим я создам поле
alter table ...
ADD TEST COMPUTED BY (cast("now" as timestamp))

И как по этому полю индекс делать... Кстати как эта проблема в яфиле решается, я не знаю..


 
kaif ©   (2004-04-11 18:01) [6]

Пока чисто эмпирически...
создаю поле
alter table city add aaa varchar(35) computed by (upper(name));

select * from city;
шикарная колонка!

alter table city add constraint x_aaa unique (aaa);

unseccesful metadata update
attempt to index COMPUTED BY column in INDEX RDB$3

Блин!

А теперь читаем документацию (Language Reference-CREATE INDEX)

You cannot index Blob columns or arrays.
A UNIQUE index cannot be created on a column or set of columns that already contains
duplicate or NULL values.  

И где тут речь о COMPUTED BY ?


 
kaif ©   (2004-04-11 18:05) [7]

2 Jack128 ©   (11.04.04 17:57) [5]
Видно надо будет поэкспериментировать со вторым способом. Но это я сделаю позже и более систематически.
А пока что облом с вычисляемым полем... Такое ощущение, что стандарт SQL делали не совсем для людей... Или в те времена в базах данных IBM использовались только большие буквы :)


 
kaif ©   (2004-04-11 23:27) [8]

Попробовал в Yaffil 877. Отлично сработало:

create unique index x_aaa on city computed by (upper(name))
И четко не допустило дубликата.

Однако попытка создать констрейнт не прошла:

alter table city add constraint x_bbb unique computed by (upper(name))

-не понял слово computed.

Но это не так обязательно (именовать такие констрейнты), так как возможность именования индекса вполне достаточна для того, чтобы потом его при желании удалить.

Еще попробую потом под
Firebird 1.5 RC4


 
Jack128 ©   (2004-04-11 23:35) [9]

Что ж..Ждем слияния кода Yaffil"a и FB...


 
kaif ©   (2004-04-12 00:16) [10]

К сожалению, CREATE UNIQUE INDEX <name> ON <table> COMPUTED BY (<exprssion>)
на Firebird 1.5 RC4 не сработала.
Зато зашел на http://firebird.sourceforge.net/
и вижу Firebird 1.5 Final Release
Постараюсь скачать, но судя по документации, там пока этого нет.
:(



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.033 c
1-1082454748
avgur
2004-04-20 13:52
2004.04.11
Ввод пароля для основной программы


9-1065386068
Дмитрий
2003-10-06 00:34
2004.04.11
Создание трейнера к игре.


14-1078224465
_none_
2004-03-02 13:47
2004.04.11
продается теннисный стол


1-1079966305
Aleksandr
2004-03-22 17:38
2004.04.11
При создании своего компонента ругается на его размеры


1-1079792412
A JI E LLI A
2004-03-20 17:20
2004.04.11
Есть ли в Дельфях функция округления до целого числа?