Можно ли ограничить автоинкрементный первичный ключ искусственными пределами? - PullRequest
0 голосов
/ 29 июля 2009

Может ли автоинкрементный первичный ключ быть ограничен искусственными пределами? Например, если я хочу, чтобы первичные ключи целых чисел были только из определенного диапазона целых чисел, скажем, от 100 до 999 включительно, и с автоинкрементом, возможно ли это? И если да, то на каком сервере баз данных программное обеспечение. В основном меня интересует MS SQL Server 2000 или более поздняя версия, но другие могут быть интересны.

Ответы [ 5 ]

3 голосов
/ 29 июля 2009

Да, вы можете сделать это с помощью столбца идентификации и проверочного ограничения:

CREATE TABLE test(rowid int identity(100,1) primary key)
GO
ALTER TABLE test ADD CONSTRAINT CK_test_Range
    CHECK (rowid >= 100 AND rowid < 1000)
GO    
INSERT INTO test default values;
GO 900    
SELECT * FROM test
GO    
DROP TABLE test

Если вам не нужны промежутки между строками, это становится немного сложнее.

2 голосов
/ 29 июля 2009

ОК, вы можете сделать это, как показано выше, но имейте в виду, что чем меньше диапазон, тем больше вероятность того, что вы достигнете точки, когда никакие данные не могут быть помещены в таблицу, поскольку диапазон был достигнут. И помните, что каждая откатная транзакция или удаленная запись занимают часть диапазона. Я очень серьезно подумаю, прежде чем предпринять такой шаг или, по крайней мере, дать ему диапазон, намного превышающий любое возможное количество записей, которые вы когда-либо будете иметь в таблице.

0 голосов
/ 30 июля 2010

Помните, что столбец IDENTITY может содержать пробелы в последовательности чисел. Неиспользуемые номера не используются повторно автоматически. Таким образом, диапазон от 100 до 999 не означает, что ваша таблица разрешит ровно 900 строк - это может быть что-то меньшее.

0 голосов
/ 29 июля 2009

Вы можете изменить начальное значение, используя DBCC CHECKIDENT(<tablename>, RESEED, <newstart>); Вы можете ограничить верхний диапазон обычным ограничением CHECK.

0 голосов
/ 29 июля 2009

Попробуйте наложить проверочное ограничение на таблицу, чтобы убедиться, что первичный ключ действителен:

</p> <pre> ALTER TABLE MyTable ADD CONSTRAINT MyPrimaryKeyConstraint CHECK (PrimaryKey >= 100 AND PrimaryKey <= 999) </pre> <p> Измените «MyTable» на имя таблицы, «MyPrimaryKeyConstraint» на любое описательное имя, а «PrimaryKey» на имя столбца первичного ключа.

...