通常,資料庫設計需要對表格列進行唯一約束,但僅限於特定情況。 讓我們用一個例子來說明這一點:
考慮一個包含 Table
、ID
和 Name
欄位的表 RecordStatus
。 RecordStatus
可以是 1(活動)或 2(刪除)。 目標是僅對活動記錄(其中 ID
= 1)強制執行 RecordStatus
列的唯一性,允許已刪除記錄重複。
雖然觸發器可以實現這一點,但更有效率、更強大的解決方案是使用過濾索引。
過濾索引在表格資料的子集上建立索引,由篩選條件定義。這允許精確控制索引,非常適合條件唯一或主鍵約束。
要僅當 ID
為 1 時強制 RecordStatus
上的唯一性,請使用下列指令:
<code class="language-sql">CREATE UNIQUE INDEX MyIndex ON MyTable(ID) WHERE RecordStatus = 1;</code>
這會在 ID
列上建立唯一索引,但僅考慮 RecordStatus
等於 1 的行。
嘗試插入重複的 ID
值且 RecordStatus
= 1 會導致錯誤,類似於:
<code>Msg 2601, Level 14, State 1, Line 13 Cannot insert duplicate key row in object 'dbo.MyTable' with unique index 'MyIndex'. The duplicate key value is (9999).</code>
過濾索引提供了一種乾淨且有效率的方法來建立條件唯一約束。 它們增強了資料完整性,而沒有通常與觸發器相關的效能開銷,為複雜的資料庫需求提供了更具可擴展性和可維護性的解決方案。 透過精確定義篩選條件,您可以選擇性地強制唯一性,與特定業務規則完美契合。
以上是如何僅在滿足特定條件時對錶列建立唯一約束?的詳細內容。更多資訊請關注PHP中文網其他相關文章!