Создание уникального ID для новой записи
|
Американская школа для одаренных детей, 1970 год, урок информатики...
- А теперь, детки, какие програмки вы бы хотели написать, когда подрастете? Вот ты, Питер?
- Я бы написал такую крутую утилитку, которая бы быстро так лечила бы винчестер от ошибок!
- Молодец, Питер! А ты, Юджин?
- А я бы сделал такую программу, которая бы быстро и без глюков сжимала файлы!
- Умница, Юджин! А ты, Билли, чего молчишь?
- Ну, ничего-ничего!... Будет вам всем быстро, будет вам без глюков...
|
Существует несколько способов задавать в таблице уникальный ID.
- Вы можете использовать поле с автоприращением
Этот метод не очень надежен. Если ваша таблица каким-то образом испортится, и
вам понадобиться ее пересобрать, автоинкрементальные поля будут перенумерованы.
Хотя это легкий способ для ситуации, когда вы не ссылаетесь на id таблицы в
других таблицах, но это не очень мудрое решение в других случаях.
- Вы можете использовать ID-таблицу
Если у вас имеется приложение, где нескольким таблицам необходимы уникальные
ID, создайте ID-таблицу с двумя полями: Table Name A (первичный ключ)
Last Id N В методе BeforePost таблицы, которой необходим уникальный ID,
делайте примерно так:
TableBeforePost(Sender: TObject)
var
Id: Integer;
begin
with TTable(Sender) do
begin
{проверяем, существует ли ID для этой записи}
if Field[0].AsInteger = 0 then
begin
{ищем имя таблицы в ID-Таблице}
IDTable.FindKey[Name]
{извлекаем последний Id - подразумеваем блокировку записи}
Id := IDTable.FieldByName['Last Id'].AsInteger;
Inc(Id);
{записываем новый Id в ID-таблицу - подразумеваем разблокировку таблицы}
IDTable.FieldByName['Last Id'].AsInteger := Id;
IDTable.Post;
{записываем извлеченный ID в вашу таблицу}
Field[0].AsInteger := Id;
end;
end;
end;
|
Если вы поместите этот код в обработчик события таблицы BeforePost, вы
убедитесь в том, что все ID будут последовательными (без "дырок"). Недостаток:
если пользовать во время попытки добавления новой записи вдруг передумает, вы
будете иметь запись с заполненным только полем ID.
В случае, если вы решили воспользоваться данным способом (последовательные
ID), поместите приведенный выше код в обработчик события таблицы OnNewRecord.
- Вы можете использовать ID-файл
Используйте те же принципы, что и в предыдущем способе, но вместо ID-таблицы
используется ID-Файл. Это дает преимущество за счет более высокой скорости
работы, но в многопользовательской среде вы должны сами заботиться о блокировке
записей.
|