我可以根据外键值创建自增列吗?

问题描述 投票:0回答:1

我有一张看起来像这样的桌子:

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
sql sql-server
1个回答
0
投票

有趣的挑战。您可以考虑创建一个序列对象,然后在插入记录以处理 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;
© www.soinside.com 2019 - 2024. All rights reserved.