Создание уникальных значений поля

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Dimm2048
Сообщения: 6
Зарегистрирован: 01 фев 2005, 11:27

Создание уникальных значений поля

Сообщение Dimm2048 » 01 фев 2005, 11:34

Кто подскажет, как решить следующую ситуацию. Я создаю записи с уникальным id. Для этого беру максимальный и прибавляю единицу.
Раньше работал со стандартом Sybase. В Ibase же оператор такой отсутствует. Вот в таком вот запросе он ругается на isnull:
insert into TASKS
select isnull(max(TASKID),0)+1 ,"12234","123","01.01.05",1,1300,0,1 from TASKS
А без него запрос будет работать только, если в таблице есть хоть одна запись.
Как бороться с данной проблемой? Есть ли в ибейсе аналог данного оператора?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 01 фев 2005, 11:59

читай www.ibase.ru/devinfo/generator.htm. прочитай целиком, внимательно, раза 2 или 3. Потом делай.

данный оператор совершенно некорректен, потому что будучи вызванным в двух экземплярах одновременно вызовет primary key violation. Т.е. по select max идентификаторы увеличивать НЕЛЬЗЯ.

кстати. вопрос - как ты попал на этот форум? Если с www.ibase.ru, то там же на первой странице прямо инструкция по "применению".

Dimm2048
Сообщения: 6
Зарегистрирован: 01 фев 2005, 11:27

Сообщение Dimm2048 » 01 фев 2005, 12:19

На самом деле такой ситуации в моём случае быть не может. Это приложение хоть и будет работать с сервером, но одновременных инсертов с разных клиентов не будет. Именно поэтому не хотелось заморачиваться с триггерами. Но видимо придётся.
А о генераторах я знаю. Ведь мой вопрос не звучал "как сгенерировать уникальный номер?". Я просто спрашивал аналог данной функции.

Dimm2048
Сообщения: 6
Зарегистрирован: 01 фев 2005, 11:27

Сообщение Dimm2048 » 01 фев 2005, 12:24

Но вобщем всё равно спасибо!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 01 фев 2005, 13:10

аналог данной "функции" и есть генератор. в Оракле sequence, в MS SQL identity и т.п.

Насчет "не может быть" - не зарекайся. лучше делать правильно сразу, чем через пару месяца получить по лбу алюминиевыми граблями.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 01 фев 2005, 13:12

Не понимаешь постановку задачи. Ему же ещё нужно тормоза на определении max получить.

Dimm2048
Сообщения: 6
Зарегистрирован: 01 фев 2005, 11:27

Сообщение Dimm2048 » 02 фев 2005, 03:40

KDV: Спасибо. Я уже понял, что в данном случае придётся использовать генератор. Но вопрос до сих пор актуален. Я сожалею, что неудачным примером привел свой запрос. Это вообще была глупая идея. Меня на самом деле интересует не уникальность номера, а функция, типа isnull. Её задача - в случае возвращения NULL подставить указанное значение, чтобы не было проблем с преобразованием типов, как, например, в моём случае, когда единицу прибавляют к NULL, что, естественно, вызывает ошибку.

Merlin: Да что ж это за люди! Не судите - да не судимы будете! (кажись, в Библии так сказано) Что за дурацкая привычка - уводить вопрос в сторону? Он же был конкретно поставлен. Если не знаете - то либо молчите, либо так и скажите. Свои 5 копеек может любой вставить, даже обезьяна, не знакомая с компом. Ну какие тормоза, если в таблице от силы 50 записей? Да плюс локальная сеть в офисе на 4 машины + выделенная машина-сервер последнего поколения на Xeone с немерянными ресурсами. Да ещё и IBServer никто, кроме этого приложения не юзает. Зачем искать гемморой там, где его нет? Старая заповедь программера с тех лет, когда ещё не было ООП, - если работает, значит не трогай, пока не сломалось. Или может мне написать мощную СУБД, открытую для изменения, только для того, чтоб юзер десяток раз в день забил себе запись о том, что нужно не забыть чайник включить на обеде, а назавтра эта запись будет удалена?

sag
Сообщения: 116
Зарегистрирован: 02 ноя 2004, 11:42

Сообщение sag » 02 фев 2005, 08:45

> Меня на самом деле интересует не уникальность номера,
> а функция, типа isnull.

Сервер какой? На fb1.5 и ib7.5 смотри в сторону CASE и COALESCE, на ранних версиях ib через udf.

> Да что ж это за люди!
Не кипятись. В сторону никто не чего не уводил. В начальной постановке вопрос выглядел именно как "генерация идентификатора записи посредством max+1", что в общем случае не есть хорошо по многим причинам, в том числе и по причине возможных тормозов на толстых таблицах.

Dimm2048
Сообщения: 6
Зарегистрирован: 01 фев 2005, 11:27

Сообщение Dimm2048 » 02 фев 2005, 09:18

Большое спасибо! Сервак старый - 5.6 Погляжу.
А про тормоза я знаю :) Да и оптимизацией знаком. Просто для переноса песчинки не требуется самосвал:) Не было под рукой другого сервака, вот и взял то, что с Билдером шло. Тут в фирмочке небольшой попросили под их задачи этакий "планнинг" наваять, чтоб на бумажках не записывать. Вот и решил айди таким образом нарисовать. За серваком же смотреть некому. Кто им обнулять генератор будет через десяток лет?:)
Мой вопрос так воспринимался похоже из-за того, что притягивал внимание к себе запрос. :) Всем спасибо!

sag
Сообщения: 116
Зарегистрирован: 02 ноя 2004, 11:42

Сообщение sag » 02 фев 2005, 09:24

Если 5.6 - то токма udf. Вот только скорее всего не имеет смысла тебе пользовать 5.6. Он стар, платен. Бери последний релиз fb.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 02 фев 2005, 09:54

Merlin: Да что ж это за люди! Не судите - да не судимы будете! (кажись, в Библии так сказано) Что за дурацкая привычка - уводить вопрос в сторону?
что за дурацкая привычка невнятно формулировать вопрос... как спросят такое, что либо вообще ничего не понятно, либо хоть стой хоть падай. А потом на общий ответ начинают отмазываться - "да я все знаю, да у меня все оптимизировано..."

и - генератор даже в 5.6 это integer. пожалуйста, подели maxint на 10 лет, потом на 365 дней, потом на 24 часа, потом на 60 минут и 60 секунд. И ты получишь количество значений, которые можешь получать от генератора в секунду, чего хватит на искомые 10 лет.

Dimm2048
Сообщения: 6
Зарегистрирован: 01 фев 2005, 11:27

Сообщение Dimm2048 » 02 фев 2005, 12:50

KDV: Сам вопрос был в последних двух предложениях и относился именно к оператору isnull. Ну протупил, ну бывает:) Я ж говорю - зря запрос вкинул.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 02 фев 2005, 12:51

Dimm2048 писал(а): Merlin: Да что ж это за люди! Не судите - да не судимы будете! (кажись, в Библии так сказано) Что за дурацкая привычка - уводить вопрос в сторону?
Каков человек - таковы и привычки. А именно - учить пилить доску не кухонным ножиком, а пилой. И не учить как это делать ножиком, хотя теоретически это возможно.
Dimm2048 писал(а): Если не знаете - то либо молчите, либо так и скажите. Свои 5 копеек может любой вставить, даже обезьяна, не знакомая с компом.
Да где уж нам уж. Придётся пожалуй замолкнуть навеки, ибо вопросов на которые надо напрячься чтоб ответить и получить от этого удовольствие, почти не бывает. Обычно просят почитать вслух доку, как и в этом конкретном случае.
Dimm2048 писал(а): Зачем искать гемморой там, где его нет?
Вот! Золотые слова. Искренне рекомендую им и следовать в дальнейшем.

Ответить