我有一個表,其中有一列應該自動遞增,但是它應該在另一個鑒別器列上遞增
例如:
| ID | 檔案編號 | 判別器 | 更多欄目... |
|---|---|---|---|
| 2AA15D5E-F158-45AE-902C-CD49644846BC | 1 | 一個 | |
| FE6B95EE-DFF4-48D4-9BD7-7DB4187A2D6D | 2 | 一個 | |
| 2A132492-447A-485D-A546-2FB9158AE71B | 1 | 乙 |
因此,如果我使用 Descriminator “A”輸入另一個條目,我將獲得 Filenumber 3。但是通過添加帶有“B”的條目,我將獲得 2,因為它是第二個“B”行。
我知道的唯一方法是更新觸發器,但是否有更簡單的解決方案,或者如果這是唯一的方法,它在流量大的情況下是否可靠(具有許多用戶的負載平衡系統)?
uj5u.com熱心網友回復:
我知道的唯一方法是更新觸發器,但是否有更簡單的解決方案,或者如果這是唯一的方法,它在流量大的情況下是否可靠(具有許多用戶的負載平衡系統)?
沒有任何方法可以不犧牲可擴展性來做到這一點。
UpdateTrigger 與 Try Catch 結合這些列上的唯一索引可能嗎?
是的,這是可能的,但我不會推薦它。您最終會遇到阻塞,甚至可能會死鎖,因此需要仔細編碼、索引設計和測驗。在最好的情況下,您的 DML 將比它可能要昂貴得多,因為它必須查詢同一鑒別器中的所有其他行,并且會話根本無法在同一鑒別器中同時運行 DML。
如果你確實想沿著這條路走下去,我會維護一個單獨的表,以鑒別器作為 PK 和 LastFileNumber。這樣你就不必掃描很多行來找出下一個 FileNumber。
所以像:
create table Discriminator(Discriminator varchar(10) not null primary key, LastFileNumber int)
然后在每一行的觸發器或存盤程序中:
set nocount on
declare @discriminator varchar(10) = 'a';
declare @fn int
declare @fnt table(fn int)
merge discriminator with (updlock, holdlock) as t
using (select 1 fn) as s
on t.Discriminator = @discriminator
when matched then update set t.LastFileNumber = t.LastFileNumber 1
when not matched then insert (Discriminator,LastFileNumber) values (@discriminator,1)
output inserted.LastFileNumber
into @fnt;
set @fn = (select fn from @fnt)
但最簡單和性能最好的解決方案是放棄 FileNumber 在每個“鑒別器”中是連續的“要求”,而只需使用 SEQUENCE 或 IDENTITY 來生成它們。所以你得到
| ID | 檔案編號 | 判別器 | 更多欄目... |
|---|---|---|---|
| 2AA15D5E-F158-45AE-902C-CD49644846BC | 1 | 一個 | |
| FE6B95EE-DFF4-48D4-9BD7-7DB4187A2D6D | 2 | 一個 | |
| 2A132492-447A-485D-A546-2FB9158AE71B | 3 | 乙 |
如果你想在每個鑒別器中顯示序數,你可以像這樣查詢
select
Id,
row_number() over (partition by Discriminator order by FileNumber) FileOrdinal,
Discriminator
from T
uj5u.com熱心網友回復:
@Larnu 已經在評論中提到了這一點,但我認為值得向您展示這種事情是多么簡單,并且使用正確的索引計算判別器應該足夠快!
簡而言之,您的表設計可以更改為在 上有一個復合的、聚集的主鍵file_number和一個額外的、遞增的欄位,例如revision_date.
CREATE TABLE your_table (
file_number int NOT NULL
, revision_date datetime NOT NULL CONSTRAINT df_your_table_revision_date (getutcdate())
, CONSTRAINT pk_your_table PRIMARY KEY (file_number, revision_date)
);
然后,您可以在表頂部創建一個視圖,為簡單起見,該視圖可用于滿足您所有的資料訪問需求:
CREATE VIEW your_data_access_view
AS
SELECT filenumber
, revision_date
, Row_Number() OVER (PARTITION BY filenumber ORDER BY revision_date) AS descriminator
FROM your_table
;
要在行動中展示它:
INSERT INTO your_table (file_number) VALUES (1);
WAITFOR DELAY '00:00:01';
INSERT INTO your_table (file_number) VALUES (2);
WAITFOR DELAY '00:00:01';
INSERT INTO your_table (file_number) VALUES (1);
SELECT filenumber
, revision_date
, descriminator
FROM your_data_access_view
ORDER
BY filenumber
, descriminator
;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/389900.html
標籤:sql sql-server 查询语句
