考虑租户 ID 的自动增量

Posted

技术标签:

【中文标题】考虑租户 ID 的自动增量【英文标题】:Auto increment considering Tenant id 【发布时间】:2017-05-11 05:45:06 【问题描述】:

我正在使用 SQL Server,需要保留一个参考租户 ID 的帐号。

我不能使用自动增量 ID,因为它是按顺序递增的,并且在客户端应用程序中有间隙。

我不能使用计算列作为聚合函数,例如 Max 是不允许的

最好的方法是什么?

【问题讨论】:

使用ROW_NUMBER() OVER (PARTITION BY TenantID ORDER BY ID ASC) @M.Ali 这是用于选择查询或视图的,对吗?我想将该列添加到表格中。 好奇你为什么不能使用 Max?当您插入记录时,PaymentId = (SELECT Max(PaymentId) + 1 FROM Table WHERE TenantId = @tenantId)。另外,作为一个小建议,如果 PaymentId 没有加入另一个表,我会简单地将其称为 PaymentNumber(Id 表示另一个表的主键)。 @BlackjacketMack +1 用于命名建议。您是否建议使用触发器?我试图将其添加为计算列.. 触发器可以工作,但我倾向于避开触发器,因为它们难以维护(保持源代码控制、识别等)。但是后触发肯定会像事务更新一样工作(在插入记录后立即运行)。 【参考方案1】:

也可以在插入数据时进行处理,例如:

insert into table1(ID,TenantId,PaymentId)
select 6,2,isnull(max(PaymentId)+1,1)
from table1 where TenantId=2 
group by TenantId

如果要使用触发器,这是一个示例,在这个示例中,即使您在插入数据时指定了 PaymentId,此触发器也会重新计算 PaymentId

    DROP TABLE table1
    CREATE TABLE Table1(ID INT IDENTITY(1,1),TenantId INT ,PaymentId INT)

    CREATE TRIGGER trg_UpdatePaymentId 
       ON  dbo.TABLE1
       AFTER INSERT
    AS 
    BEGIN

        SET NOCOUNT ON;

        UPDATE t SET t.PaymentId=a.rn
        FROM dbo.TABLE1 AS t INNER JOIN (
            SELECT i.ID,(ISNULL(c.MaxPaymentId,0)+ ROW_NUMBER()OVER(PARTITION BY TenantId ORDER BY ID)) AS rn FROM Inserted AS i
            OUTER APPLY(
                SELECT MAX(tt.PaymentId) AS MaxPaymentId FROM Table1 AS tt WHERE tt.TenantId=i.TenantId AND NOT EXISTS(SELECT 0 FROM Inserted AS ii WHERE ii.ID=tt.ID)
            ) AS c
        ) AS a ON a.ID=t.ID 


    END
    GO


    INSERT INTO table1(TenantId)VALUES(1),(2),(1),(1)
    SELECT * FROM dbo.TABLE1
ID TenantId PaymentId ------------ ------------ ------------ 1 1 1 2 2 1 3 1 2 4 1 3

【讨论】:

需要在表级别进行修复,因为我正在使用 .Net Entity 框架添加数据。 @PAVITRA 我给你一个触发样本。

以上是关于考虑租户 ID 的自动增量的主要内容,如果未能解决你的问题,请参考以下文章

具有自动增量的 mongodb 第二个 id 字段

将自动增量 ID 添加到现有的升序列?

休眠自动增量

MySQL 多行插入是不是获取顺序自动增量 ID?

列的工厂相同 ID,自动增量,Laravel

当与模型链接的表为非自动增量时,Laravel 模型获取下一个增量 ID