Вы можете указать, что поля с типом integer в таблицах баз данных содержат значения, которые увеличиваются автоматически. Таблица может содержать множество полей, которые содержат автоувеличивающиеся значения. Автоувеличение значений в полях не поддерживается для локальный (local), удаленных (remote) или отключаемых (offline) представлениях.

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

Для получения более подробной информации о том, как установить поля с автоматически увеличивающимися значениями смотрите описание задачи Как: установить Autoincrementing для значений поля.

Приведенные ниже разделы содержат более подробную информацию об областях Visual FoxPro подверженных воздействию полей с автоматически увеличивающимися значениями:

Изменение структуры для для полей с Autoincrementing

Когда вы активируете автоматическое увеличение значений для любого поля в таблице, Visual FoxPro устанавливает байт 0 в 0x31 для указания типа файла "Visual FoxPro, Autoincrement enabled" в структуре заголовочной записи таблицы (.dbf). Visual FoxPro устанавливает байт 18, байты с 19 по 22 и байты 23 структуре подзаписей поля в приведенные ниже значения соответственно:

  • 0x0C для полей с автоувеличением.

  • Следующее значение.

  • Значение шага.

Для получения более подробной информации смотрите описание Структура файла таблицы.

Рассуждения для полей с Autoincrementing

Поля, которые содержат значения с автоматическим увеличением получают признак "только для чтения" и не могут быть изменены в операциях вставки, удаления или замещения данных. Попытка обновить такое поле будет приводить к генерации сообщения об ошибке до тех пор, пока вы сбросите свойство автоувеличения курсора AutoIncError с помощью функции CURSORSETPROP() в False (.F.) или не выключите сообщение об ошибке с помощью команды SET AUTOINCERROR. Для получения более подробной информации смотрите описание функции CURSORSETPROP() и команды SET AUTOINCERROR.

Таблицы, содержащие поля с автоматическим увеличением значений добавляют записи из буфферированной таблицы примерно на 35% медленнее, чем таблицы без оных полей, что может повлечь за собой снижение производительности приложения. При использовании табличной буфферизации при добавлении записи заголовок таблицы блокируется.

Visual FoxPro не обслуживает пробелы в генерируемых последовательностях. Пробелы или дыры в последовательностях могут быть вызваны сбросом добавляемых или вставляемых записей (revert), неудачной операцией обновления базовой таблицы и тому подобным. Во всем случаях, неиспользованные значения теряются, а следующие генерируемые значения остаются такими же, как если бы операции добавления или вставки записей были удачными.

Версии, до Visual FoxPro 8.0 не могут распознавать таблицы, которые используют автоматическое увеличение значений поля. Если вы удаляете эту возможность для полей, текущее состояние, содержащее последние значения автоувеличения очищаются из субзаписей поля табличного файла (.dbf) и сбрасываются. Тип табличного файла (.dbf) восстанавливается до значения текущего типа Visual FoxPro. Значения, которые автоматически увеличивались и хранились в полях остаются в каждой записи неизменнными.

Локальные представления и поля с Autoincrementing

Представления не "наследуют" поведения автоувеличения базовой таблицы, и поэтому поля в представлении, которые представляют поля с автоувеличением значением в базовой таблицы становятся обновляемыми - "read/write". Автоувеличение значений поля происходит в базовой таблице при обновлении строки или строк. Если вы хотите "освежить" (refresh) представление с полями с автоувеличением значениями сгенерированными ранеее, вы должны использовать фукнцию REQUERY( ). Для получения более подробной информации смотрите ее описание в Функция REQUERY().

Буфферизация таблиц и поля с Autoincrementing

Visual FoxPro не производит любого управления автоувеличением для буфферированных таблиц. Все добавляемые или вставляемые записи, имеют сгенерированные значения для полей с автоувеличением, независимо от того, какой буффер активен - таблицы или строки. В случае буфферирования, при вызове функции TABLEUDPATE(), базовые таблицы обновляются с ранее генерированными значениями. Если обновление не произошло, например в случае вызова функции TABLEREVERT(), любые сгенерированные значения для полей с автоувеличением сбрасываются, в результате чего образуются пробелы или дыры в последовательности.

Блокировка записи и поля с Autoincrementing

Когда вы включаете автоувеличение значений для поля, начальное значение - Next Value - и значение шага - Step - хранятся в заголовке табличного файла (.dbf) в неиспользованной или зарезервированной порции субзаписи поля для указанного поля. Next Value хранится как 4-байтный integer. Значение Step value хранится как 1-байтный integer с максимальным значением в 255. Значение, реально используемое для увеличения значения поля представляет собой сумму значений, хранящихся в заголовке таблицы и значения шага. Последовательность происходящих операций описываются приведенным ниже:

  • Производится операции вставки или добавления.

  • Блокируется заголовок.

  • Увеличивается хранящееся текущее значение увеличения на значение Step и применяется к полю.

  • В заголовке табличного файла (.dbf) сохраняется новое значение, которое равно значению во вновь добавленной записи.

  • После завершения операции добавления или вставки заголовок разблокируется. Заголовок содержит последнее полученное значение.

Смотрите также