2014-03-03 42 views
0

我們仍然在sql server 2005上。Sql server 2005和獨特的索引創建

我們正試圖在我們的病人表上創建一個唯一的索引。 唯一索引將是一個多列索引(狀態,患者編號,第一個,最後一個,DOB,性別)。 但是,數據已經包含多個重複項。

我們可以有2條記錄(Active,0001,John,Doe,1/1/1960,M)和(Active,0001,John,Doe,1/1/1960,M) 1必須被禁用。 我們也可以有2條記錄(Active,0001,John,Doe,1/1/1960,M)和(Active,0001,John,Doe,1/1/1960,M)必須爲2條記錄中的一條找到新的PatientNumber,以表明2名不同的患者恰好具有相同的姓名,DOB和性別。

由於有dups,用戶已經失去dups保持一個活的記錄。所以我們可以有3條記錄(Inactive,0001,John,Doe,1/1/1960,M)和(Inactive,0001,John,Doe,1/1/1960,M)和(Active,0001,John, Doe,1960年1月1日,M)。爲了創建唯一索引,必須刪除一個不活動的dup。

業務不包含修復現有的重複數據。

我們不希望使用函數來強制患者唯一性來檢查活動行。

我的計劃是根據以下考慮清理數據:如果數據中存在重複鍵值,則無法創建唯一索引,UNIQUE約束或PRIMARY KEY約束。

但是我們的dba表示在創建一個唯一索引時會有一個選項,可以讓您創建該索引並且不會抱怨現有的dups?毋庸贅言,聽到這種選擇後,這家公司非常高興。

例如:我計劃在2014年4月1日創建唯一索引。創建索引時,我可以使用一些「選項」來告訴sql server不打擾4/1/2014之前存在的重複項?索引創建後(即2014年4月1日以後),所有的dups都將違規。

我很難找到該選項。任何人都可以建議或評論?

謝謝!

+0

我檢查了來自Microsoft的2005年的文檔CREATE INDEX,我找不到這樣的選項。有一個關於忽略重複鍵的選項,但這隻會影響INSERT語句而不會影響創建本身 –

+0

謝謝Mojooo。我聽到你。我也沒有找到任何這樣的選擇。 dba回覆說它是IGNORE_DUP_KEY選項,但是當dup數據仍然存在時,這個選項確實無助於創建索引。 – Daisy

+0

http://dba.stackexchange.com/questions/43823/can-i-add-a-unique-constraint-that-ignores-existing-violations –

回答

1

SQL Server 2005 manual其實說的;

如果鍵列中存在重複值,則無法創建唯一索引或約束。

這就是說,你可以解決它。以下是一種方式,如果您的情況可以接受則由您決定;下面的示例有一個保留,我只有SQL Server 2008才能測試:)

您可以執行的操作是創建一個_dedupe列並將其包括在索引中。對於現有的重複項,您可以在列中設置唯一值,並留下一行以NULL的值。插入其他值時,請不要設置_dedupe列,並且您將失敗重複的插入。

作爲一個例子;

> CREATE TABLE test (id INT, value INT); 
> INSERT INTO test (id, value) VALUES (1,1),(2,1),(3,3); 

id value 
---------- 
1 1 
2 1 
3 3 

> ALTER TABLE test ADD _dedupe INT; 

-- Update, partition by the value combination that is not unique now but 
-- should be later, in this case "value". 

> WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY value ORDER BY id)-1 rn FROM test 
) 
    UPDATE cte SET _dedupe = CASE WHEN rn=0 THEN NULL ELSE rn END; 

id value _dedupe 
-------------------- 
1 1  NULL 
2 1  1 
3 3  NULL 

> CREATE UNIQUE INDEX uq_value ON test(value, _dedupe); 

> INSERT INTO test (id, value) VALUES (4,1) <-- fail, not unique 

An SQLfiddle to test with

此方法的一個不足之處是,防止重複插入的唯一行是NULL行,如果刪除該行,最終可能會得到與現有編號行重複的新副本。這可能會或可能不會成爲您系統的問題。

+0

謝謝你,約阿希姆。我會考慮這種方法。這聽起來可行。到目前爲止,我有兩個選擇:(1)你的方法;(2)將所有的學生移動到一個「舊」桌子上,並保留一個沒有孿生子的主桌子。這將幫助我創建獨特的索引。我將不得不創建一個從舊錶和主表中選擇查詢和報告的視圖...不確定性能。無論哪種方式,我有一個多列唯一索引,所以我將不得不觀看錶演。 – Daisy