我有一张看起来像这样的桌子:
id int IDENTITY(1,1) {auto increment}
foreignKeyId int
autoId int {not unique}
我想让
autoId
列基于 foreignKeyId
自动递增,因此当使用 foreignKeyId = 1
插入一行时,autoId
必须为 1,对于具有 foreignKeyId = 1
autoId 的另一行必须是 2 等等,但是当使用 foreignKeyId = 2
插入一行时,autoId
必须再次为 1,
我尝试过使用触发器,但我相信在大规模应用程序中使用它们并不理想,并且当一次有多个插入时可能会失败
CREATE TRIGGER [dbo].[TableAutoIdUpdate]
ON [dbo].[Table]
AFTER INSERT
AS
BEGIN
DECLARE @autoId int;
SELECT @autoId = COALESCE(MAX(autoId), 0) + 1
FROM Table
WHERE foreignKeyId IN (SELECT foreignKeyId FROM inserted);
UPDATE Table
SET autoId = @autoId
WHERE id IN (SELECT id FROM inserted);
END
有趣的挑战。您可以考虑创建一个序列对象,然后在插入记录以处理 autoId 列之前调用函数返回值。
CREATE SEQUENCE dbo.CustomerInvoice START WITH 1 INCREMENT BY 1;
GO
CREATE FUNCTION usf_GetAutoIdValue
(
@foreignKeyId INT = NULL
)
RETURNS INT
AS
BEGIN
DECLARE @ReturnedAutoID INT;
IF EXISTS (
SELECT 1
FROM CustomerOrderTable
WHERE autoId = @foreignKeyID
)
BEGIN
SET @ReturnedAutoID = NEXT VALUE FOR CustomerInvoice;
END;
ELSE
BEGIN
SELECT @ReturnedAutoID = current_value
FROM sys.sequences
WHERE name = 'CustomerInvoice';
END;
RETURN @ReturnedAutoID;
END;