Хорошо, во-первых, вам определенно необходимо определить свой PK как для CompanyID, так и для ID, если вы собираетесь выполнить эту задачу (в противном случае вы получите конфликт PK, когда попытаетесь вставить клиента 1 компании 2, предполагая, чтоУ компании 1 уже есть клиент 1.
Как только у вас возникнет требование «без пропусков», вам, скорее всего, придется что-то делать самостоятельно, а не использовать функции IDENTITY в SQL Server, и вы собираетесьпотеря масштабируемости.
Два очевидных варианта - выбрать MAX (ID) + 1 из этой таблицы для следующего идентификатора (но в этом случае необходимо поддерживать исключительную блокировку таблицы между определением этого значения и выполнением вставки.), Или для поддержки отдельной таблицы следующих идентификаторов, которые будут использоваться (в этом случае вам понадобится исключительная блокировка строки для строки, которую вы используете и увеличиваете). Например, у вас может быть такая таблица:
CREATE TABLE CompanyCustomerIDs (
CompanyID int not null,
NextCustomerID int not null,
constraint PK_CompanyCustomerIDs PRIMARY KEY (CompanyID)
)
Тогда ваша вставка в таблицу «Клиенты» будет выглядеть примерно так:
declare @CustomerID int
begin transaction
update CompanyCustomerIDs WITH (ROWLOCK,HOLDLOCK,XLOCK) set @CustomerID = NextCustomerID = NextCustomerID + 1 where CompanyID = @CompanyID
insert into Customers (CompanyID,CustomerID,/* Other COlumns */)
select @CompanyID,@CustomerID,/* Other columns */
commit
Как я уже сказал, это будетоказывает влияние на масштабируемость базы данных.