Создание уникального ID для новой записи

Как создать уникальный индекс для поля?

Существует несколько способов задавать в таблице уникальный ID.

  1. Можно использовать автоинкрементное поле. Этот метод не очень надежен. Если таблица каким-то образом испортится и понадобится ее пересобрать, автоинкрементные поля будут перенумерованы. Хотя это легкий способ для ситуации, когда нет ссылки на ID в других таблицах, но это не очень мудрое решение в других случаях.

  2. Можно использовать ID-таблицу. Если имеется приложение, где нескольким таблицам необходимы уникальные ID, создайте ID-таблицу (IDTable) с двумя полями: Name (первичный ключ) и Last_Id. В методе BeforePost таблицы, которой необходим уникальный ID, сделайте так:
    procedure TForm1.Table1BeforePost(DataSet: TDataSet);
    var
      Id: Integer;
    begin
    { проверяем, существует ли ID для этой записи }
      if Table1.Fields[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 в вашу таблицу }
        Table1.Fields[0].AsInteger := Id;
      end;
    end;
    
    Поместив этот код в обработчик события BeforePost, можно убедиться, что все ID будут последовательными. Недостаток: если пользователь во время попытки добавления новой записи вдруг передумает, то получится запись только с заполненным полем ID.

    Для того чтобы воспользоваться данным способом (последовательные ID), поместите приведенный выше код в обработчик события таблицы OnNewRecord.

  3. Можете использовать ID-файл.
Руководствуйтесь теми же принципами, что и в предыдущем способе, но вместо ID-таблицы создается ID-файл. Это дает преимущество за счет более высокой скорости работы, но в многопользовательской среде нужно заботиться о блокировке записей.