![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
узнать значение автоинкрементного поля
_qwerty_ © (2011-12-13 12:45:00)можно ли до Post узнать какое значение будет иметь автоинкрементное поле AutoId таблицы ItemsTable (AutoId, Code, Name)?
у меня есть метод, который добавлят запись в таблицу и для поля "code" назначает значение, если Code = '', то полю "code" нужно назначить значение поля "AutoId". Проблема в том, что до Post я не могу узнать каким будет значение "AutoId".
procedure TItems.AddItem(Code: string);
begin
// ...
ItemsTable.Append;
try
if Code = '' then
// <- полю "Code" назначить значение поля "AutoId"
else
ItemsTable.FieldByName('code').AsString := Code;
except
ItemsTable.Cancel;
raise;
end;
end;
Cobalt (2011-12-13 18:33:00) [1]Вот жеж люди придумывают себе геморрой...
Если нужен тебе ID - генерируй его сам.
А Автоинкремент - он для целей, когда тебя не заботит какой будет ID у вставленной записи.
Jeer (2011-12-13 17:53:00) [2]Хм.. а кто был против "цифры" ?
Речь шла о разных способах генерации уникального суррогатного ключа aka PK, в качестве которого, есс-но, выступает один из целочисленных типов.
OW (2011-12-13 17:47:00) [3]
> Jeer ©
ну не знаю.. чем OLAP цифра не понравится?
да даже join лучше пройдет с цифрой, нежели с чем-то еще..
Jeer (2011-12-13 17:19:00) [4]
> Но это время, а СУБД выполняет это быстрее.
Если основная операция "чтение", а не вставка - какая разница, сколько будет длиться запись ( в разумных пределах ).
Еще раз - разные системы бывают.
То, что преобладают OLTP, не означает, что OLAP должны использовать достигнутое первыми.
Jeer (2011-12-13 17:15:00) [5]
> > А у меня бывает и байт :)
>
> тогда зачем БД :)
>
Миллион-с взаимосвязанных таблиц с пределом каждая в 255 записей.
Запись не одним полем, есс-но :)
Ниче ? :)
OW (2011-12-13 16:50:00) [6]
> Игорь Шевченко © (2006-11-10 17:25) [74]
> ANB © (2006-11-10 17:28) [76]
> автоинкремент - зло
Хотелось бы послушать/почитать этих людей еще раз. Не переменилась ли т.з.
и почему
OW (2011-12-13 16:49:00) [7]
> Это философский вопрос
как нить приеду на ММП, привезу мордовский бальзам, пофилософствуем :)
> Самому надо еще добиться уникальности,
нет проблем
согласен. Но это время, а СУБД выполняет это быстрее.
тот же Oracle с сиквенсом. Все равно он бронирует за один запрос одно число, что может быть проще для него, сервера. Ты, клиент, так не можешь себе позволить. Ну гайд возьмешь, ну + время или там рандом + что-то или еще как хитро. Сервер с автоинком не переплюнуть все равно.
> А у меня бывает и байт :)
тогда зачем БД :)
> Думать - люблю, ибо..
нет, определенно надо все же думательной смеси прихватить как нить :)
Jeer (2011-12-13 16:34:00) [8]Ну и тут - полезные мысли:
http://baks.gaz.ru/oradoc/ora/ora368.htm
Jeer (2011-12-13 16:28:00) [9]
> Ega23 © (13.12.11 15:14) [8]
> > Вот не пользуюсь AutoInc из партийных соображений :)
> Зря.
Не надо забывать, что практика и задачи у всех разная.
Кто-то на OLTP сидит, а кто-то OLAP практикует.
Отсюда и подходы могут быть разные.
Сентенции от некоторых:
***********
Игорь Шевченко © (2006-11-10 17:25) [74]
to Jeer © (10.11.06 17:02) [68]
..потому что всякий autoincrement есть зло, порочащее реляционную теорию, хотя в ряде случаев..
ANB © (2006-11-10 17:28) [76]
автоинкремент - зло, хоть и небольшое.
Jeer (2011-12-13 16:13:00) [10]
> зря.
Это философский вопрос
> Самому надо еще добиться уникальности,
Нет проблем
а в СУБД autoinc
> он integer, т.е. работает быстрее
А у меня бывает и байт :)
> и думать не надо как она
> там при этом уникальности добьется.
Думать - люблю, ибо..
Ega23 (2011-12-13 15:14:00) [11]
> Вот не пользуюсь AutoInc из партийных соображений :)
Зря.
OW (2011-12-13 14:44:00) [12]
> Jeer © (13.12.11 14:39) [6]
не пользуюсь AutoInc из партийных соображений
зря.
Самому надо еще добиться уникальности, а в СУБД autoinc он integer, т.е. работает быстрее и думать не надо как она там при этом уникальности добьется.
А id он и есть id. Он как номер паспорта или Родина, которых не выбирают :)
Jeer (2011-12-13 14:39:00) [13]Вот не пользуюсь AutoInc из партийных соображений :)
OW (2011-12-13 14:16:00) [14]code := 'БРЕД'
update table set code = autoid where code = 'БРЕД'
DiamondShark (2011-12-13 13:07:00) [15]
> если Code = '', то полю "code" нужно назначить значение поля "AutoId".
Не нужно назначить значение поля "AutoId". Пусть будет пустое.
Если пустое нельзя, то AutoId -- это всё равно не допустимое значение, а заплатка для дырки в протекающем дизайне.
Ваша действительная проблема заключается в том, что у вас с верхнего уровня абстракции приходят недопустимые значения, а не в том, как получить автоинкрементное значение.
Решайте реальную проблему, а не выстругивайте затычку.
Ega23 (2011-12-13 13:05:00) [16]
> Конечно, в немонопольном режиме тоже можно, но эта информация
> будет бесполезной, т.к. другой клиент может записать поле
> в таблицу раньше вас.
Смотря что за природа автоинкремента. Сиквенсы транзакционно независимы.
И. Павел (2011-12-13 12:55:00) [17]> Если БД используете монопольно
Конечно, в немонопольном режиме тоже можно, но эта информация будет бесполезной, т.к. другой клиент может записать поле в таблицу раньше вас.
И. Павел (2011-12-13 12:54:00) [18]> [0] _qwerty_ (13.12.11 12:45)
Можно сперва создать транзакцию и запросом записать строку в таблицу (заодно можно вычленить id есть много способов). Потом, если окажется, что строка не нужна, откатите транзакцию.
Если БД используете монопольно, то можно и узнать значение автоинкрементного поля. Только вы не указали название БД. Вот пример: http://asweb.ru/notes/mysql/next-auto-increment/