2010-04-07 142 views
26

我有一個表上的兩列主鍵。我試圖改變它與此命令設置的ignore_dup_key到:我可以爲主鍵設置ignore_dup_key嗎?

ALTER INDEX PK_mypk on MyTable 
SET (IGNORE_DUP_KEY = ON); 

但我得到這個錯誤:

Cannot use index option ignore_dup_key to alter index 'PK_mypk' as it enforces a primary or unique constraint.

否則怎麼我應該設置IGNORE_DUP_KEY上?

回答

21

它沒有在Books Online中記錄,但是我發現雖然這對主鍵有效,但不能用ALTER INDEX更改,您必須刪除並重新創建主鍵。

請記住,此標誌不允許你實際存儲重複行,它只是改變了錯誤的結果:

ON 
A warning message will occur when duplicate key values are inserted into a unique 
index. Only the rows violating the uniqueness constraint will fail. 

OFF 
An error message will occur when duplicate key values are inserted into a 
unique index. The entire INSERT operation will be rolled back. 

http://msdn.microsoft.com/en-us/library/ms175132.aspx

3

它決定了當您插入重複的只有

ALTER TABLE..index option

Specifies the error response when an insert operation attempts to insert duplicate key values into a unique index. The IGNORE_DUP_KEY option applies only to insert operations after the index is created or rebuilt. The option has no effect when executing CREATE INDEX, ALTER INDEX, or UPDATE.

..和它並不適用於的PK

的ALTER TABLE關於這個BOL註釋,會發生什麼「向後兼容性」有點令人困惑。我只是試了一下,BradC是正確的。

CREATE TABLE dbo.foo (bar int PRIMARY KEY WITH (FILLFACTOR=90, IGNORE_DUP_KEY = ON)) 
GO 
INSERT dbo.foo VALUES (1) 
GO 
INSERT dbo.foo VALUES (1) 
GO 
--gives  
(1 row(s) affected) 

Duplicate key was ignored. 

(0 row(s) affected) 
0

請注意,此設置隻影響如果您嘗試插入重複鍵會發生什麼,它不會允許你插入重複鍵。

如果您試圖插入重複鍵,您可以刪除主鍵索引,插入記錄,修正數據(刪除重複項等),然後重新創建索引。

0

個人而言,我從不希望它忽略重複。如果主鍵有重複值,則需要修復。我不希望它被忽略,並插入其他記錄,因爲那麼用戶可能會認爲它們都被插入。這個設置是對一個不好的插入過程的掩飾。設計良好的進程不需要此設置,因爲它在進入數據之前會清理數據(或使用upsert更新現有數據並插入新數據),並將錯誤記錄發送到表中,以便修復並重新插入或發送錯誤回到用戶,所以他們知道他們的記錄沒有被插入。

+2

我的問題是這樣的:我需要每天插入大量的記錄,我目前正在爲每條記錄做插入命令。如果記錄已經存在,那麼它會被忽略(通過拋出一個重複的鍵錯誤)。從性能POV中,最好嘗試插入並允許一些插入失敗,而不是在插入之前檢查記錄是否存在。 提高性能的下一步是使用SqlBulkCopy爲每條記錄執行插入而不是單個命令。但是如果任何記錄存在,如果ignore_dup_key關閉,整個批次失敗,則這是不可能的。 – 2010-04-07 22:56:31

+0

如果我的主鍵上的某一列是用戶定義的呢?如果我需要同時支持多個實體的插入,比如說1000?如何在插入之前驗證所有條目是唯一的,而不會對服務器產生嚴重影響?我認爲在這種情況下,忽略重複選項非常合適。你不同意嗎? – julealgon 2015-06-26 14:05:29

+0

是的,如果你忽略了重複項,並且你不願意,你就不會主鍵;如果你是主鍵,那麼你最終會遇到一個帶有壞數據的世界。將數據放入臨時表中然後使用select語句只插入新記錄是一種更好的做法。我們以這種方式插入了百萬條記錄。 – HLGEM 2015-06-26 15:15:49

48
ALTER TABLE [TableName] REBUILD WITH (IGNORE_DUP_KEY = ON) 
+0

它不適用於Postgresql - 9.5 PSQL不理解關鍵字IGNORE_DUP_KEY。有什麼辦法讓它(或類似的東西)在Postgresql中工作> = 9.5 – Bhindi 2017-08-01 07:47:42

+0

不知道。這個問題被標記爲sql-server,因此請嘗試搜索PostgreSQL的類似問題。 – Kvasi 2017-08-07 09:22:08

相關問題