2015-09-16 141 views
1

我對用戶名和暱稱字段都有唯一的限制。當我使用重複的暱稱運行以下代碼時,SQL Server 2008報告Err 23000違反唯一密鑰約束。但是當我用重複的用戶名運行它時沒有錯誤(雖然消息「影響行:0」的結果並且沒有改變對錶產生影響)。SQL Server 2008插入失敗報告

我不明白爲什麼這應該是或如何處理這個(我想在任何一種情況下引發的錯誤)。提前致謝。

INSERT INTO會員(用戶名,暱稱) VALUES( '鮑勃', 'bob55')


CREATE TABLE [Members].[Members] (
[GUID] uniqueidentifier NOT NULL DEFAULT (newsequentialid()) , 
[UserName] nvarchar(256) NOT NULL , 
[NickName] nvarchar(256) NOT NULL , 
) 


-- ---------------------------- 
-- Indexes structure for table Members 
-- ---------------------------- 
CREATE UNIQUE INDEX [Index:UserName] ON [Members].[Members] 
([UserName] ASC) 
WITH (IGNORE_DUP_KEY = ON) 
GO 

-- ---------------------------- 
-- Primary Key structure for table Members 
-- ---------------------------- 
ALTER TABLE [Members].[Members] ADD PRIMARY KEY ([GUID]) 
GO 

-- ---------------------------- 
-- Uniques structure for table Members 
-- ---------------------------- 
ALTER TABLE [Members].[Members] ADD UNIQUE ([NickName] ASC) 
GO 
ALTER TABLE [Members].[Members] ADD UNIQUE ([UserName] ASC) 
GO 
+1

請出示你的表DEF和INSERT語句。 – DeanOC

+2

該行爲與您的DDL中的「IGNORE_DUP_KEY = ON」一致。但我不知道爲什麼它忽略了另外兩個限制。首先將「ON」改爲「OFF」。這是出於任何原因嗎? –

+0

更多的信息在這裏:http://stackoverflow.com/questions/533659/why-would-you-not-set-ignore-dup-key-to-on –

回答

1

有兩種方式,使在SQL Server領域獨樹一幟:

  1. 唯一約束
  2. 唯一索引

當您創建一個唯一索引,你可以在試圖插入重複值的情況下設置一個數據庫的行爲:

  • WITH (IGNORE_DUP_KEY = ON) - 什麼都不做,只是忽略新記錄有重複值
  • WITH (IGNORE_DUP_KEY = OFF) - 拋出一個異常

當你創建一個唯一約束,以含蓄的方式SQL Server創建的唯一索引WITH (IGNORE_DUP_KEY = OFF)

在你的問題,你創建3個唯一索引:一個在列名UserName上顯式顯示,另一個在NickName和UserName字段上顯示兩個。當您嘗試插入具有重複的UserName的記錄時,插入將停止在唯一的索引衝突上,並且SQL Server將忽略該記錄。沒有工作的唯一約束。但是當您嘗試插入帶有重複NickName的記錄時,唯一約束會生成錯誤。

如果你想獲得在同樣這兩個領域的錯誤,只是下降的唯一索引: DROP INDEX [Index:UserName] ON [Members].[Members]

+0

完美,謝謝。 Fwiw我使用Navicat 11,由於某些原因,當我創建一個索引時,它默認添加了IGNORE_DUP_KEY = ON。 我的推斷是正確的,那麼如果我有一個唯一的索引字段,我不需要一個唯一的約束? (我現在會測試,但總是喜歡放心;) –

+0

經過測試是的,唯一索引對同一個字段的唯一約束無關緊要。再次感謝。 –