IDENTITY само по себе не означает УНИКАЛЬНО - это просто означает автоинкремент от текущего начального значения на величину приращения. Это не волнует, если уже есть такая ценность. Если вы также объявите столбец как уникальный (в таких ситуациях, как ваша, это обычно означает пометку его как первичного ключа), вы не получите ни одного из этих дубликатов, и вам следует довольно быстро выяснить, кто виноват, потому что приложение или пользователь получит ошибки нарушения ограничений.
Кроме TRUNCATE TABLE , существуют другие способы, которыми значения IDENTITY могут быть аналогичным образом нарушены:
DBCC CHECKIDENT () может использоваться, чтобы вручную установить текущее начальное значение на то, что хочет пользователь.
SET IDENTITY_INSERT можно использовать для ручного переопределения следующего доступного значения. Писец может делать это так, что им не нужно заботиться о том, сделали ли вы столбец значением идентификатора, или нет, они все равно могут переопределить его, как захотят.
Вы можете запустить трассировку на стороне сервера, которая бы захватила эти события, чтобы выяснить, вызывается ли какое-либо из них.
Всегда полезно указать, какую версию SQL Server вы используете, или, по крайней мере, пометить вопрос минимальной версией, которую вам нужно поддерживать, поскольку решение и поведение для SQL Server 2000, например, часто могут быть довольно отличается от SQL Server 2008 R2. Просто полезный совет для будущего вопроса.