Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

узнать значение автоинкрементного поля


_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/


Наверх

Титульная страница Поиск, карта сайта Написать письмо