我正在使用SQL Server並需要保留一個參考租戶ID的記帳號碼。考慮租戶ID的自動增量編號
我無法使用自動遞增ID,因爲它是按順序遞增並且在客戶端應用程序中存在間隙。
我不能使用計算列像Max
聚合函數是不允許
什麼是我們的最佳方法呢?
我正在使用SQL Server並需要保留一個參考租戶ID的記帳號碼。考慮租戶ID的自動增量編號
我無法使用自動遞增ID,因爲它是按順序遞增並且在客戶端應用程序中存在間隙。
我不能使用計算列像Max
聚合函數是不允許
什麼是我們的最佳方法呢?
您也可以處理時插入數據,例如:
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實體框架來添加數據。 – PAVITRA
@PAVITRA我給你一個觸發器樣本。 –
使用'ROW_NUMBER()OVER(PARTITION BY TenantID ORDER BY ID ASC)' –
@ M.Ali這是選擇查詢或意見的權利? 我想將列添加到表中。 – PAVITRA
好奇你爲什麼不能使用Max?當您插入您的記錄PaymentId =(SELECT Max(PaymentId)+ 1 FROM WHERE TenantId = @tenantId)。 此外,作爲一個輕微的建議,如果PaymentId沒有加入到另一個表中,我會簡單地將它稱爲PaymentNumber(Id表示另一個表的主鍵)。 – BlackjacketMack