我試圖在 db 級別對資料強制執行一些唯一性。為了論證起見,我的專欄是:
ID
DocID (FK)
FileName
FileRevision
Province
ActiveState
所以在這個例子中,我希望只輸入一次 DocID、FIleName 和 FileRevision 的組合。這沒問題,我可以創建一個 UNIQUE 約束。
然而問題是,如果“ActiveState”設定為“X”,我想允許這些專案的任何組合。
換句話說,只有在 ActiveState <> 'X' 時才強制唯一性。
我的理解是我不能有一個帶條件的 UNIQUE 約束。我讀過索引,想知道這是否是我需要走的路?
我不是 Oracle 專家(顯然),只是在尋找提示!
uj5u.com熱心網友回復:
您可以使用虛擬列,然后在虛擬列上創建唯一約束:
CREATE TABLE table_name (
ID NUMBER PRIMARY KEY,
DocID NUMBER,
FileName VARCHAR2(10),
FileRevision NUMBER,
Province NUMBER,
ActiveState VARCHAR2(1),
ActiveDocID GENERATED ALWAYS AS (CASE ActiveState WHEN 'X' THEN NULL ELSE DocID END),
ActiveFileName
GENERATED ALWAYS AS (CASE ActiveState WHEN 'X' THEN NULL ELSE FileName END),
ActiveFileRevision
GENERATED ALWAYS AS (CASE ActiveState WHEN 'X' THEN NULL ELSE FileRevision END),
CONSTRAINT table_name__uniq UNIQUE (
ActiveDocID,
ActiveFileName,
ActiveFileRevision
)
);
uj5u.com熱心網友回復:
同樣,Oracle 提供了條件索引概念。您可以在表上創建條件索引,如下所示 -
CREATE UNIQUE INDEX idx_ActiveState
ON YOUR_TABLE (CASE WHEN ActiveState <> 'X' THEN DocID ELSE NULL END,
CASE WHEN ActiveState <> 'X' THEN FIleName ELSE NULL END,
CASE WHEN ActiveState <> 'X' THEN FileRevision ELSE NULL END);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/336351.html
標籤:甲骨文
