我有一个表,其中主键有2列(CODE nvarchar,VALUE nvarchar)。此表包含Key列中的值为(X8900,A)但是当我尝试插入新值时as(X8900,a),它给出错误消息“主键违规”。
为什么它会给出这个错误,如果值列的情况不同,是否有任何解决方案以避免错误?
答案 0 :(得分: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;
答案 1 :(得分: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')
可以在列或数据库级别设置排序规则。如果设置为数据库级别,则未指定排序规则的所有字符列都采用数据库排序规则。