Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.04.01;
Скачать: CL | DM;

Вниз

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

 
_qwerty_   (2011-12-13 12:45) [0]

можно ли до 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;


 
И. Павел ©   (2011-12-13 12:54) [1]

> [0] _qwerty_   (13.12.11 12:45)

Можно сперва создать транзакцию и запросом записать строку в таблицу (заодно можно вычленить id &#151; есть много способов). Потом, если окажется, что строка не нужна, откатите транзакцию.

Если БД используете монопольно, то можно и узнать значение автоинкрементного поля. Только вы не указали название БД. Вот пример: http://asweb.ru/notes/mysql/next-auto-increment/


 
И. Павел ©   (2011-12-13 12:55) [2]

> Если БД используете монопольно

Конечно, в немонопольном режиме тоже можно, но эта информация будет бесполезной, т.к. другой клиент может записать поле в таблицу раньше вас.


 
Ega23 ©   (2011-12-13 13:05) [3]


> Конечно, в немонопольном режиме тоже можно, но эта информация
> будет бесполезной, т.к. другой клиент может записать поле
> в таблицу раньше вас.


Смотря что за природа автоинкремента. Сиквенсы транзакционно независимы.


 
DiamondShark ©   (2011-12-13 13:07) [4]


> если Code = "", то полю "code" нужно назначить значение поля "AutoId".

Не нужно назначить значение поля "AutoId". Пусть будет пустое.
Если пустое нельзя, то AutoId -- это всё равно не допустимое значение, а заплатка для дырки в протекающем дизайне.

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

Решайте реальную проблему, а не выстругивайте затычку.


 
OW ©   (2011-12-13 14:16) [5]

code := "БРЕД"

update table set code = autoid where code = "БРЕД"


 
Jeer ©   (2011-12-13 14:39) [6]

Вот не пользуюсь AutoInc из партийных соображений :)


 
OW ©   (2011-12-13 14:44) [7]


> Jeer ©   (13.12.11 14:39) [6]
не пользуюсь AutoInc из партийных соображений

зря.
Самому надо еще добиться уникальности, а в СУБД autoinc он integer, т.е. работает быстрее и думать не надо как она там при этом уникальности добьется.

А id он и есть id. Он как номер паспорта или Родина, которых не выбирают :)


 
Ega23 ©   (2011-12-13 15:14) [8]


> Вот не пользуюсь AutoInc из партийных соображений :)


Зря.


 
Jeer ©   (2011-12-13 16:13) [9]


> зря.


Это философский вопрос


> Самому надо еще добиться уникальности,


Нет проблем


а в СУБД autoinc
> он integer, т.е. работает быстрее


А у меня бывает и байт :)


> и думать не надо как она
> там при этом уникальности добьется.


Думать - люблю, ибо..


 
Jeer ©   (2011-12-13 16:28) [10]


> 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:34) [11]

Ну и тут - полезные мысли:
http://baks.gaz.ru/oradoc/ora/ora368.htm


 
OW ©   (2011-12-13 16:49) [12]


> Это философский вопрос

как нить приеду на ММП, привезу мордовский бальзам, пофилософствуем :)

> Самому надо еще добиться уникальности,
нет проблем

согласен. Но это время, а СУБД выполняет это быстрее.
тот же Oracle с сиквенсом. Все равно он бронирует за один запрос одно число, что может быть проще для него, сервера. Ты, клиент, так не можешь себе позволить. Ну гайд возьмешь, ну + время или там рандом + что-то или еще как хитро. Сервер с автоинком не переплюнуть все равно.


> А у меня бывает и байт :)

тогда зачем БД :)


> Думать - люблю, ибо..

нет, определенно надо все же думательной смеси прихватить как нить :)


 
OW ©   (2011-12-13 16:50) [13]


> Игорь Шевченко ©   (2006-11-10 17:25) [74]


> ANB ©   (2006-11-10 17:28) [76]


> автоинкремент - зло


Хотелось бы послушать/почитать этих людей еще раз. Не переменилась ли т.з.
и почему


 
Jeer ©   (2011-12-13 17:15) [14]


> > А у меня бывает и байт :)
>
> тогда зачем БД :)
>


Миллион-с взаимосвязанных таблиц с пределом каждая в 255 записей.
Запись не одним полем, есс-но :)
Ниче ? :)


 
Jeer ©   (2011-12-13 17:19) [15]


> Но это время, а СУБД выполняет это быстрее.


Если основная операция "чтение", а не вставка - какая разница, сколько будет длиться запись ( в разумных пределах ).
Еще раз - разные системы бывают.
То, что преобладают OLTP, не означает, что OLAP должны использовать достигнутое первыми.


 
OW ©   (2011-12-13 17:47) [16]


> Jeer ©

ну не знаю.. чем OLAP цифра не понравится?
да даже join лучше пройдет с цифрой, нежели с чем-то еще..


 
Jeer ©   (2011-12-13 17:53) [17]

Хм.. а кто был против "цифры" ?

Речь шла о разных способах генерации уникального суррогатного ключа aka PK, в качестве которого, есс-но, выступает один из целочисленных типов.


 
Cobalt ©   (2011-12-13 18:33) [18]

Вот жеж люди придумывают себе геморрой...
Если нужен тебе ID - генерируй его сам.
А Автоинкремент - он для целей, когда тебя не заботит какой будет ID у вставленной записи.



Страницы: 1 вся ветка

Текущий архив: 2012.04.01;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
2-1323670231
И. Павел
2011-12-12 10:10
2012.04.01
Почему &amp;laquo;Return value must be undefined&amp;raquo;?


1-1289586492
shebe91
2010-11-12 21:28
2012.04.01
Все возможные замены символов в пароле:


15-1323009920
LDV
2011-12-04 18:45
2012.04.01
FireMonkey


15-1323157523
Pit
2011-12-06 11:45
2012.04.01
Delphi 7, приложение падает, если включена оптимизация


2-1323698714
Студент1
2011-12-12 18:05
2012.04.01
DB-компонент с форматированным текстом