Создание уникальных значений поля
Создание уникальных значений поля
Кто подскажет, как решить следующую ситуацию. Я создаю записи с уникальным id. Для этого беру максимальный и прибавляю единицу.
Раньше работал со стандартом Sybase. В Ibase же оператор такой отсутствует. Вот в таком вот запросе он ругается на isnull:
insert into TASKS
select isnull(max(TASKID),0)+1 ,"12234","123","01.01.05",1,1300,0,1 from TASKS
А без него запрос будет работать только, если в таблице есть хоть одна запись.
Как бороться с данной проблемой? Есть ли в ибейсе аналог данного оператора?
Раньше работал со стандартом Sybase. В Ibase же оператор такой отсутствует. Вот в таком вот запросе он ругается на isnull:
insert into TASKS
select isnull(max(TASKID),0)+1 ,"12234","123","01.01.05",1,1300,0,1 from TASKS
А без него запрос будет работать только, если в таблице есть хоть одна запись.
Как бороться с данной проблемой? Есть ли в ибейсе аналог данного оператора?
читай www.ibase.ru/devinfo/generator.htm. прочитай целиком, внимательно, раза 2 или 3. Потом делай.
данный оператор совершенно некорректен, потому что будучи вызванным в двух экземплярах одновременно вызовет primary key violation. Т.е. по select max идентификаторы увеличивать НЕЛЬЗЯ.
кстати. вопрос - как ты попал на этот форум? Если с www.ibase.ru, то там же на первой странице прямо инструкция по "применению".
данный оператор совершенно некорректен, потому что будучи вызванным в двух экземплярах одновременно вызовет primary key violation. Т.е. по select max идентификаторы увеличивать НЕЛЬЗЯ.
кстати. вопрос - как ты попал на этот форум? Если с www.ibase.ru, то там же на первой странице прямо инструкция по "применению".
На самом деле такой ситуации в моём случае быть не может. Это приложение хоть и будет работать с сервером, но одновременных инсертов с разных клиентов не будет. Именно поэтому не хотелось заморачиваться с триггерами. Но видимо придётся.
А о генераторах я знаю. Ведь мой вопрос не звучал "как сгенерировать уникальный номер?". Я просто спрашивал аналог данной функции.
А о генераторах я знаю. Ведь мой вопрос не звучал "как сгенерировать уникальный номер?". Я просто спрашивал аналог данной функции.
KDV: Спасибо. Я уже понял, что в данном случае придётся использовать генератор. Но вопрос до сих пор актуален. Я сожалею, что неудачным примером привел свой запрос. Это вообще была глупая идея. Меня на самом деле интересует не уникальность номера, а функция, типа isnull. Её задача - в случае возвращения NULL подставить указанное значение, чтобы не было проблем с преобразованием типов, как, например, в моём случае, когда единицу прибавляют к NULL, что, естественно, вызывает ошибку.
Merlin: Да что ж это за люди! Не судите - да не судимы будете! (кажись, в Библии так сказано) Что за дурацкая привычка - уводить вопрос в сторону? Он же был конкретно поставлен. Если не знаете - то либо молчите, либо так и скажите. Свои 5 копеек может любой вставить, даже обезьяна, не знакомая с компом. Ну какие тормоза, если в таблице от силы 50 записей? Да плюс локальная сеть в офисе на 4 машины + выделенная машина-сервер последнего поколения на Xeone с немерянными ресурсами. Да ещё и IBServer никто, кроме этого приложения не юзает. Зачем искать гемморой там, где его нет? Старая заповедь программера с тех лет, когда ещё не было ООП, - если работает, значит не трогай, пока не сломалось. Или может мне написать мощную СУБД, открытую для изменения, только для того, чтоб юзер десяток раз в день забил себе запись о том, что нужно не забыть чайник включить на обеде, а назавтра эта запись будет удалена?
Merlin: Да что ж это за люди! Не судите - да не судимы будете! (кажись, в Библии так сказано) Что за дурацкая привычка - уводить вопрос в сторону? Он же был конкретно поставлен. Если не знаете - то либо молчите, либо так и скажите. Свои 5 копеек может любой вставить, даже обезьяна, не знакомая с компом. Ну какие тормоза, если в таблице от силы 50 записей? Да плюс локальная сеть в офисе на 4 машины + выделенная машина-сервер последнего поколения на Xeone с немерянными ресурсами. Да ещё и IBServer никто, кроме этого приложения не юзает. Зачем искать гемморой там, где его нет? Старая заповедь программера с тех лет, когда ещё не было ООП, - если работает, значит не трогай, пока не сломалось. Или может мне написать мощную СУБД, открытую для изменения, только для того, чтоб юзер десяток раз в день забил себе запись о том, что нужно не забыть чайник включить на обеде, а назавтра эта запись будет удалена?
> Меня на самом деле интересует не уникальность номера,
> а функция, типа isnull.
Сервер какой? На fb1.5 и ib7.5 смотри в сторону CASE и COALESCE, на ранних версиях ib через udf.
> Да что ж это за люди!
Не кипятись. В сторону никто не чего не уводил. В начальной постановке вопрос выглядел именно как "генерация идентификатора записи посредством max+1", что в общем случае не есть хорошо по многим причинам, в том числе и по причине возможных тормозов на толстых таблицах.
> а функция, типа isnull.
Сервер какой? На fb1.5 и ib7.5 смотри в сторону CASE и COALESCE, на ранних версиях ib через udf.
> Да что ж это за люди!
Не кипятись. В сторону никто не чего не уводил. В начальной постановке вопрос выглядел именно как "генерация идентификатора записи посредством max+1", что в общем случае не есть хорошо по многим причинам, в том числе и по причине возможных тормозов на толстых таблицах.
Большое спасибо! Сервак старый - 5.6 Погляжу.
А про тормоза я знаю
Да и оптимизацией знаком. Просто для переноса песчинки не требуется самосвал:) Не было под рукой другого сервака, вот и взял то, что с Билдером шло. Тут в фирмочке небольшой попросили под их задачи этакий "планнинг" наваять, чтоб на бумажках не записывать. Вот и решил айди таким образом нарисовать. За серваком же смотреть некому. Кто им обнулять генератор будет через десяток лет?:)
Мой вопрос так воспринимался похоже из-за того, что притягивал внимание к себе запрос.
Всем спасибо!
А про тормоза я знаю

Мой вопрос так воспринимался похоже из-за того, что притягивал внимание к себе запрос.

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