2015-02-12 30 views
0

我有一張表,其中的主鍵在那裏有兩列(CODE nvarchar,VALUE nvarchar)。該表包含鍵列中的值(X8900,A),但當我嘗試插入一個新值(X8900,a)時,它給出錯誤消息「主鍵違例」。由於大小寫不一致導致SQL服務器密鑰被破壞

爲什麼它給出這個錯誤,如果情況是不同的值列,並有任何解決方案,以避免錯誤?

回答

0

您可以指定SQL Server應該是是否區分大小寫或不使用排序規則。在這種情況下,該列必須具有區分大小寫的排序規則,以便您能夠指定任何類型的唯一約束。例如,第一個示例將失敗,而第二個將工作,注意CI和CS不區分大小寫和敏感。

CREATE TABLE test1 (
col1 varchar(20) COLLATE Latin1_General_CI_AS PRIMARY KEY 
) 

INSERT INTO test1 VALUES ('ASD') 
INSERT INTO test1 VALUES ('asd') 

CREATE TABLE test2 (
col1 varchar(20) COLLATE Latin1_General_CS_AS PRIMARY KEY 
) 

INSERT INTO test2 VALUES ('ASD') 
INSERT INTO test2 VALUES ('asd') 

整理可以在列或數據庫級別進行設置。如果設置爲數據庫級別,則沒有指定歸類的所有字符列將採用數據庫歸類。

0

您必須檢查數據庫的排序規則。如果你有一個不區分大小寫的排序規則,'A'=='a'。如果需要維護案例之間的差異,則可以將排序規則更改爲區分大小寫的排序規則,也可以將這些字符串轉換爲varbinary規則。二元表示區分個案。

排序規則可以在服務器級(即數據庫默認設置的)和數據庫級設置(覆蓋服務器排序規則)。在更細化的層次上,您可以根據需要設置單個列上的排序規則。這裏有一些文章來看看:

https://msdn.microsoft.com/en-us/library/hh230914.aspx#TsqlProcedure https://msdn.microsoft.com/en-us/library/ms144250%28v=sql.105%29.aspx

這裏有幾個SQL片段可以運行,查看當前服務器排序規則,以及每個數據庫的默認排序規則

SELECT CONVERT (varchar, SERVERPROPERTY('collation')); 

SELECT name, collation_name FROM sys.databases; 
相關問題