Как зарезервировать значение ID-поля таблицы?
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Как зарезервировать значение ID-поля таблицы?... Expand / Collapse
Автор
Сообщение
07.02.2006 5:52
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 17.10.2006 7:27
Сообщ.: 113, Visits: 1 241
Как зарезервировать значение ID-поля таблицы для последующей возможной вставки записи с этим ID?
Т.е. до реальной вставки записи пользователь должен видеть её будущий уникальный номер. И чтобы без проблем мог делать вставку не опасаясь, что этот ID будет занят! Или не делать вставку, если передумал :)
Сообщ. #890183
07.02.2006 10:47
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Единственный надежный способ это делать предварительную вставкуи получать id этой записи. Как вариант можно пытаться убрать с колонки признак IDENTIY и генерить (и вставлять) id самостоятельно, но это будет ненадежно в многопользовательской среде.

Зачем вообще тебе это нужно? Поле id по своей сути это всегда служебное поле. Зачеи пользователю знать и видеть его значение?
Сообщ. #890203
08.02.2006 6:34
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 17.10.2006 7:27
Сообщ.: 113, Visits: 1 241
Такое вот требование у заказчика!!!
Чтобы при заполнении формы, там был указан ID!!!
При предварительной вставке! Как мне потом убивать запись, если юзер не захочет ничего продолжать делать, а просто закроет окошко браузера?
Создать какое-нить поле флага - информирующее о действительном создании записи?
Но как потом узнать можно ли удалять записи с отсутсвующим флагом, не редактируется ли она в данный момент другим юзером
Можно открывать транзакцию конечно, но опять же, если юзер решит закрыть окно или просто будет тупо смотреть на экран в течении часа, она будет потом висеть, заблокировав при этом всю таблицу!
Будет не приятно!
Жаль, что нет сиквенсов!
Сообщ. #890279
08.02.2006 12:48
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
А если схитрить и показывать максимальное значение id+1? :)
Но на самом деле ничего не вставлять.
Сообщ. #890319
08.02.2006 13:52
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 17.10.2006 7:27
Сообщ.: 113, Visits: 1 241
если хитрить, то значит обманывать!
И запись может не лечь в базу именно под этим номером, если в это время кто-то другой добавил запись
Но решение у меня вроде появилось (пока не реализованое):
В момент открытия формы добавления записи
в базе действительно вставляем запись
берём её ID и показываем клиенту
далее удаляем запись с этим ID
а потом, если всё же юзер решить сохранить свою запись,
то делаем SET IDENTITY OFF (или ON - точно не помню) (разрешаем правку ключевого поля)
и вставляем запись с готовым ID

Как на первый взгляд решение? Должно подойти?
Сообщ. #890324
08.02.2006 14:09
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
[quote="Karbofos"]если хитрить, то значит обманывать!
И запись может не лечь в базу именно под этим номером, если в это время кто-то другой добавил запись[/quote]
Все так, согласен. Просто требование глупое и поэтому я и предложил такое решение.

[quote="Karbofos"]Но решение у меня вроде появилось (пока не реализованое):
В момент открытия формы добавления записи
в базе действительно вставляем запись
берём её ID и показываем клиенту
далее удаляем запись с этим ID
а потом, если всё же юзер решить сохранить свою запись,
то делаем SET IDENTITY OFF (или ON - точно не помню) (разрешаем правку ключевого поля)
и вставляем запись с готовым ID

Как на первый взгляд решение? Должно подойти?[/quote]
Должно сработать. Сделай это все внутри хранимой процедуры и внутри транзакции чтобы в случае ошибки отключить IDENTITY_INSERT.

Такое решение будет работать только для одной таблицы так как нельзя включить IDENTITY_INSERT для нескольких таблиц одновременно. Значит в многопользовательской среде могут начаться проблемы.

Может все-таки вставдять пустую запись, получать ее id и далее делать UPDATE вместо INSERT. Чтобы таблица не замусоривовалась незаконченными записями введи поле dtCreated DEFAULT(getdate()) и сделай job удаляющий пустые записи у которых dtCreated меньше текущей даты скажем на неделю.
Сообщ. #890328
09.02.2006 6:20
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 09.02.2006 6:18
Сообщ.: 2, Visits: 23
решение конечно не плохое, но как быть с пропуском значений в ID ? (или это не критично)
Сообщ. #890370
10.03.2006 13:59
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 14.11.2007 10:35
Сообщ.: 105, Visits: 1 152
>>>то делаем SET IDENTITY OFF (или ON - точно не помню) (разрешаем правку ключевого поля)
и вставляем запись с готовым ID

А если кто-то вставит запись, то ID все-равно окажется занятым, и если даже ошибка не произойдет, то чужая запись будет затерта как я полагаю. Так что шутить с полем ID не есть хорошо :)





Сообщ. #892445
10.03.2006 17:08