Американская школа для одаренных детей, 1970 год, урок информатики...
- А теперь, детки, какие програмки вы бы хотели написать, когда подрастете? Вот ты, Питер?
- Я бы написал такую крутую утилитку, которая бы быстро так лечила бы винчестер от ошибок!
- Молодец, Питер! А ты, Юджин?
- А я бы сделал такую программу, которая бы быстро и без глюков сжимала файлы!
- Умница, Юджин! А ты, Билли, чего молчишь?
- Ну, ничего-ничего!... Будет вам всем быстро, будет вам без глюков...
Существует несколько способов задавать в таблице уникальный ID.
Вы можете использовать поле с автоприращением
Этот метод не очень надежен. Если ваша таблица каким-то образом испортится, и
вам понадобиться ее пересобрать, автоинкрементальные поля будут перенумерованы.
Хотя это легкий способ для ситуации, когда вы не ссылаетесь на id таблицы в
других таблицах, но это не очень мудрое решение в других случаях.
Вы можете использовать ID-таблицу
Если у вас имеется приложение, где нескольким таблицам необходимы уникальные
ID, создайте ID-таблицу с двумя полями:
Table Name A (первичный ключ)
Last Id N
В методе BeforePost таблицы, которой необходим уникальный ID,
делайте примерно так:
TableBeforePost(Sender: TObject)
var
Id: Integer;
beginwith TTable(Sender) dobegin{проверяем, существует ли ID для этой записи}if Field[0].AsInteger = 0 thenbegin{ищем имя таблицы в 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-Файл. Это дает преимущество за счет более высокой скорости
работы, но в многопользовательской среде вы должны сами заботиться о блокировке
записей.
Создание уникального ID для новой записи может быть выполнено с помощью поля с автоприращением, ID-таблицы или ID-файла, но первый способ не рекомендуется в случаях, когда таблица будет пересобранная, а второй и третий способы обеспечивают последовательно
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.