Sql-Server
我需要幫助使用 hierarchyid 數據類型並需要對 varchar 欄位進行唯一約束
我想使用hierarchyid標識符將一堆具有父->子->孫關係的表解析為一個表。這是我根據我所擁有的提出的。
CREATE TABLE [dbo].[tbl_server_group] ( [refid] [int] IDENTITY(1,1) NOT NULL, [refhid] [hierarchyid] NOT NULL, [reflvl] AS refhid.GetLevel() PERSISTED, [refdate] [datetime] NOT NULL DEFAULT GETDATE(), [refname] [varchar](50) NOT NULL )
我的問題是我需要能夠要求 refname 是唯一的,但只能在它所在的容器內。因為我使用它來表示伺服器,所以我想模擬各種 DNS 樹,但添加其他層它也是。我的例子如下:
ROOT | something.com || www ||| index.html || staging ||| testbed.php | someotherthing.com || test ||| index.html
我想確保something.com 只有一個“www”,而www 只有一個“index.html”。
無論如何有約束條件嗎?如果沒有,是否有一種有效的方法來強制唯一性?
謝謝
如果您為祖先添加另一列,例如
CREATE TABLE [dbo].[tbl_server_group] ( [refid] [int] IDENTITY(1,1) NOT NULL, [refhid] [hierarchyid] NOT NULL, [reflvl] AS refhid.GetLevel() PERSISTED, [refdate] [datetime] NOT NULL DEFAULT GETDATE(), [refname] [varchar](50) NOT NULL, [reflvl1id] AS refhid.GetAncestor(1) PERSISTED );
您可以確保每個父母只有一個“www”。您可以為“index.html”創建一個類似的索引。
create unique index ux_tbl_server_group_1 on tbl_server_group(reflvl1id, refname) where refname = 'www';
顯然,這不僅僅是第一級(www)和
www
(index.html)的子級,但我不明白為什麼擴展的限制不起作用。如果您必須完全按照指定的方式實現它,那麼您將不得不求助於使用觸發器。
注意:這利用了 SQL Server 的過濾索引,因此您必須為任何接觸此表的程序正確設置 SET。