Реферат: К вопросу об идентификаторах
--- результат:
ID some_values
----------- --------------------------------------------------
1 value 1
2 value 2
5 value 3
(3 row(s) affected)
Но здесь другая тонкость, если при отключенной автогенерации не указать явно, какое значение необходимо вставить в автоинкрементное поле, то вставка опять-таки успехом не увенчается.
INSERT INTO Ident_table (some_values) VALUES ('value 4') --- результат: Explicit value must be specified for identity column in table 'Ident_table' when IDENTITY_INSERT is set to ON. |
Таким образом, возможно два варианта заполнения автоинкрементного столбца, либо этим занимается сервер, и тогда невозможно явно изменить значение в этом поле, либо это делается вручную, но тогда это поле обязательно к заполнению.
ПРЕДУПРЕЖДЕНИЕ Следует помнить, что если автоинкрементное поле заполняется самостоятельно и на это поле не установлено никаких дополнительных требований уникальности, то запросто можно записать туда несколько одинаковых значений. |
Если же теперь опять вернуть серверу возможность вставлять номера в автоинкрементное поле, то следующее значение будет больше, на число указанное в increment при создании столбца, самого большого значения в этом поле. Не важно вручную было введено это самое большое значение или сгенерировано сервером.
SET IDENTITY_INSERT Ident_table ON GO INSERT INTO Ident_table (some_values) VALUES ('value 4') SELECT * FROM Ident_table --- результат: ID some_values ----------- -------------------------------------------------- 1 value 1 2 value 2 5 value 3 6 value 4 (4 row(s) affected) |
Все это конечно здорово, но, как правило, просто уникально идентифицировать запись недостаточно, необходимо еще связать эту запись с записью из другой таблицы по этому самому идентификатору. А для этого надо уметь получать этот идентификатор сразу же после его генерации. Для выполнения этой задачи в Microsoft SQL Server существуют 3 функции: @@IDENTITY, SCOPE_IDENTITY() и IDENT_CURRENT().