SQL Server 使Varchar PK区分大小写?

nr7wwzry  于 2022-12-17  发布在  其他
关注(0)|答案(2)|浏览(187)

我必须在我的SQL Server数据库表中存储Varchar类型的ID。ID是唯一的,它们将用于更新/删除操作。
所以我决定把它们做成PK。问题是,PK“A”和“a”中只允许有一个,而这两个都可能在我必须导入的数据集中。

INSERT INTO test(test) VALUES('A')
INSERT INTO test(test) VALUES('a')
Violation of the PRIMARY KEY constraint 'PK_test'. Cannot insert duplicate key in object 'dbo.test'.

我是否可以使PK区分大小写-以便在插入“A”后,可以插入“a”,但不可以插入“A”?

3bygqnnd

3bygqnnd1#

一种选择是将数据库的排序规则更改为区分大小写的排序规则,如SQL_Latin1_General_CP1_CS_AS
您可以在SQL Server Management Studio中通过对象资源管理器执行此操作,方法是右键单击数据库,然后转到“属性”〉“选项”,然后选择“排序规则”下拉列表。名称中包含“CS”的任何排序规则都区分大小写。
当然,正如评论中所指出的,这可能是矫枉过正,您也可以只覆盖一列的排序规则,如下所述:
https://msdn.microsoft.com/en-us/library/ms190920.aspx

e7arh2l6

e7arh2l62#

不必使整个数据库都区分大小写,只需使主键列区分大小写即可:

CREATE TABLE dbo.T_NodeNames
(
     node_name national character varying(20) COLLATE German_PhoneBook_100_CS_AS_KS_WS_SC_UTF8 NOT NULL
    ,tag_name national character varying(20) NULL
    ,tag national character varying(20) NULL
    ,node_type int NULL 
    ,deprecated int NULL
    ,descr national character varying(128) NULL
    ,creation_mechanism national character varying(50) NULL
    ,support national character varying(50) NULL
    ,use_instead national character varying(50) NULL
    ,CONSTRAINT pk_node_names PRIMARY KEY(node_name) 
); 
GO

或作为表变量:

DECLARE @nodeNames TABLE 
(
     node_name national character varying(20) COLLATE German_PhoneBook_100_CS_AS_KS_WS_SC_UTF8 NOT NULL PRIMARY KEY 
    ,tag_name national character varying(20) NULL 
    ,tag national character varying(20) NULL 
    ,node_type int NULL 
    ,deprecated int NULL 
    ,descr national character varying(128) NULL 
    ,creation_mechanism national character varying(50) NULL 
    ,support national character varying(50) NULL 
    ,use_instead national character varying(50) NULL 
);

相关问题