Форум: "Начинающим";
Текущий архив: 2012.04.01;
Скачать: [xml.tar.bz2];
Внизузнать значение автоинкрементного поля Найти похожие ветки
← →
_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 — есть много способов). Потом, если окажется, что строка не нужна, откатите транзакцию.
Если БД используете монопольно, то можно и узнать значение автоинкрементного поля. Только вы не указали название БД. Вот пример: 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.003 c