Дэвид У. Фентон писал: «Поле Jet Autonumber не является полем идентификации. Это только длинное целое поле со специальным значением по умолчанию. Это значение по умолчанию может быть INCREMENT или RANDOM, но так как это только значение по умолчанию , вы можете добавить любое длинное целое значение в поле, если оно не нарушает индекс. "
Это немного запутано. Синтаксис ACE / Jet SQL имеет ключевое слово IDENTITY
(COUNTER
, AUTOINCREMENT
), но не имеет ключевого слова AUTONUMBER. Очевидно, что ACE / Jet IDENTITY
является IDENTITY
!
Но то, что я хочу рассмотреть здесь (слишком долго для комментария), является искажением того, что это «только длинное целое поле со специальным значением по умолчанию».
Рассмотрим этот DDL ACE / Jet SQL (синтаксис режима запросов ANSI-92):
CREATE TABLE Test2_IDENTITY
(
ID_identity_1 IDENTITY NOT NULL,
ID_identity_2 IDENTITY NOT NULL,
data_column INTEGER
);
При выполнении происходит сбой с сообщением «Результирующей таблице не разрешено иметь более одного поля AutoNumber». Очевидно, что здесь происходит нечто иное, чем «специальное значение по умолчанию».
Ключевое слово IDENTITY
создает автономное число (при отсутствии лучшего термина) с алгоритмом увеличения для генерации значений. IDENTITY
нельзя использовать для создания автономного номера со случайным алгоритмом или разновидностью идентификатора GUID (идентификатора репликации). Для этих других случаев вам действительно необходимо использовать «специальное значение по умолчанию», например,
CREATE TABLE TestAutonumbers
(
ID_identity IDENTITY NOT NULL,
ID_random INTEGER DEFAULT GenUniqueID() NOT NULL,
ID_guid UNIQUEIDENTIFIER DEFAULT GenGUID() NOT NULL,
data_col INTEGER
);
Если вы используете такую технологию, как ADOX, для проверки свойств этой таблицы (информационной схемы), вы обнаружите, что только для столбца, созданного с ключевым словом IDENTITY, свойство Autoincrement имеет значение true, а для COLUMN_HASDEFAULT этого столбца установлено значение false, а COLUMN_DEFAULT - ноль. Так что если столбец IDENTITY имеет «специальное значение по умолчанию», то движок не сообщает.
В отличие от IDENTITY
, с этими другими разновидностями автонумера нет явного ограничения на таблицу, например, это отлично работает:
CREATE TABLE Test2_Autonumbers
(
ID_random_1 INTEGER DEFAULT GenUniqueID() NOT NULL,
ID_random_2 INTEGER DEFAULT GenUniqueID() NOT NULL,
ID_guid_1 UNIQUEIDENTIFIER DEFAULT GenGUID() NOT NULL,
ID_guid_2 UNIQUEIDENTIFIER DEFAULT GenGUID() NOT NULL,
data_col INTEGER
);
Что-то, чего я не знаю, это то, существует ли «специальное значение по умолчанию», эквивалентное GenUniqueID()
и GenGUID()
для создания столбца с автоинкрементом, используя DEFAULT
и без использования ключевого слова IDENTITY
(или его синонимов ). Если кто-то знает так или иначе, пожалуйста, дайте мне знать.
Кстати, вышеупомянутое сообщение об ошибке говорит о том, что я ошибался, считая «Автономер» термином доступа. Похоже, что на уровне механизма ACE / Jet 'Autonumber' является синонимом не ключевого слова для IDENTITY
(то есть, автоинкрементным автоматическим номером аромата), но не является синонимом для других разновидностей autonumber.