Как говорили другие до меня, использование первичного ключа с вычисленными значениями автоинкремента звучит как очень плохая идея!
Если вам позволено и если вы можете жить с недостатками (см. Внизу), я бы предложил следующее:
Используйте обычную числовую клавишу автоинкремента и символ (4) столбец, который содержит только идентификатор компании.
Затем, когда вы выбираете из таблицы, вы используете row_number в столбце автоинкремента и объединяете его с идентификатором компании, чтобы у вас был дополнительный столбец с «ключом»выглядит так, как вы хотели (MSFT00001, MSFT00002, ...)
Пример данных:
create table customers
(
Id int identity(1,1) not null,
Company char(4) not null,
CustomerName varchar(50) not null
)
insert into customers (Company, CustomerName) values ('MSFT','First MSFT customer')
insert into customers (Company, CustomerName) values ('MSFT','Second MSFT customer')
insert into customers (Company, CustomerName) values ('ABCD','First ABCD customer')
insert into customers (Company, CustomerName) values ('MSFT','Third MSFT customer')
insert into customers (Company, CustomerName) values ('ABCD','Second ABCD customer')
Это создаст таблицу, которая выглядит следующим образом:
Id Company CustomerName
------------------------------------
1 MSFT First MSFT customer
2 MSFT Second MSFT customer
3 ABCD First ABCD customer
4 MSFT Third MSFT customer
5 ABCD Second ABCD customer
Теперь запустите следующий запрос:
select
Company + right('00000' + cast(ROW_NUMBER() over (partition by Company order by Id) as varchar(5)),5) as SpecialKey,
*
from
customers
Возвращает ту же таблицу, но с дополнительным столбцом с вашим "специальным ключом":
SpecialKey Id Company CustomerName
---------------------------------------------
ABCD00001 3 ABCD First ABCD customer
ABCD00002 5 ABCD Second ABCD customer
MSFT00001 1 MSFT First MSFT customer
MSFT00002 2 MSFT Second MSFT customer
MSFT00003 4 MSFT Third MSFT customer
Вы можете создать представлениес этим запросом, и пусть каждый использует это представление, чтобы убедиться, что все видят столбец «специального ключа».
Однако у этого решения есть два недостатка:
- Вам нужен хотя бы SQLServer 2005 для того, чтобы
row_number
работал. - Числа в специальном ключе изменятся при удалении компаний из таблицы.Поэтому, если вы не хотите, чтобы числа менялись, вы должны убедиться, что из этой таблицы ничего не удалено.