Sql-Server

PRIMARY KEY 約束(帶有 NONCLUSTERED INDEX)可以只檢查某些值嗎?

  • December 19, 2016

我可以設置一個(邏輯)PRIMARY KEY 約束,由(物理)NONCLUSTERED INDEX 提供服務,以便它只檢查相關表中受約束和索引列或另一列的某些值?

如果是這樣,該列是否可以建立為從其他表引用的 FOREIGN KEY 約束?

我試圖基本上看看我是否可以從表中刪除某些行而不從表中刪除這些行,但仍然強制執行關係,例如:

  • IDs > 1000, 要麼
  • CreatedDateTime > RemovalDate.

例如,您可以有這種約束:

ALTER TABLE MyTable WITH NOCHECK ADD 
   CONSTRAINT PK_MyTable CHECK (Id > 1000)

但是如何將此列設置為使用非集群索引固定的主鍵?

我可以做類似以下定義的事情嗎:

ALTER TABLE MyTable WITH NOCHECK ADD 
   CONSTRAINT PK_MyTable CHECK (CreatedOn > '01/01/2010')

但是有一個名為的列的索引Id

似乎有些混亂。CHECK (Id > 1000)不是約束,是PRIMARY KEY約束CHECK

您可以擁有部分(過濾的*)唯一索引,如果這是您所追求的:(UNIQUE (id) WHERE (id > 1000) 但這不是主鍵約束或可用於主鍵約束的索引)。創建它:

CREATE UNIQUE INDEX Id_more_than_1000_PUQ
 ON MyTable (id) WHERE (id > 1000) ;

這意味著所有id大於 1000 的值在該列上只會出現一次。所有其他值(1000 和更低)將被允許重複。

同樣對於日期列:

CREATE UNIQUE INDEX Id_when_created_on_2010_and_after_PUQ
 ON MyTable (id) WHERE (CreatedOn >= '20100101') ;

這意味著對於CratedOn2010 年及之後的行,這些id值將是唯一的。對於該唯一索引,將忽略所有其他行(CreatedOn在 2009 和更早的時間或)。NULL所以你可能有重複id的值,只要一個不匹配WHERE索引的條件。

這些索引當然是非聚集的——所有的部分索引都是。

而且它們不能用作FOREIGN KEY約束的目標。

*:請參閱 MSDN 上的CREATE INDEXFileterd 索引頁面或使用和優勢的詳細資訊。


關於他們“為什麼我們不能引用部分索引?”:

這就是 SQL 標準所說的以及它在 SQL Server 中的實現方式。FK 約束必須引用表的一列(或多列)。不是索引。根據定義,部分索引包含列中出現的部分值,而不是全部值。

我前段時間問的一個相關問題:是否存在允許引用視圖(而不僅僅是基表)的外鍵的 DBMS?.

關係模型中不存在不允許定義此類 FK 的固有問題。但是 SQL(委員會和各種 DBMS)並沒有將此作為功能添加。

引用自:https://dba.stackexchange.com/questions/157515