Sql 表中的列的类型不能用作索引中的键列
我有一个存储员工详细信息的表。我想更改该表,并将列Sql 表中的列的类型不能用作索引中的键列,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个存储员工详细信息的表。我想更改该表,并将列emp\u code中的一列设置为主键。它的数据类型是nvarchar(max),但我无法将其设置为主键 我运行以下查询: ALTER TABLE user_master ADD PRIMARY KEY (emp_code) 但这给了我一个错误: Msg 1919,第16级,状态1,第1行 表user\u master中的列emp\u code的类型不能用作索引中的键列。 Msg 1750,第16级,第0状态,第1行 无法创建约束。请参阅前面的
emp\u code
中的一列设置为主键。它的数据类型是nvarchar(max)
,但我无法将其设置为主键
我运行以下查询:
ALTER TABLE user_master
ADD PRIMARY KEY (emp_code)
但这给了我一个错误:
Msg 1919,第16级,状态1,第1行表
user\u master
中的列emp\u code
的类型不能用作索引中的键列。Msg 1750,第16级,第0状态,第1行
无法创建约束。请参阅前面的错误
如何克服这个问题?索引键的总大小不能超过900字节。将数据类型更改为
NVARCHAR(450)
。如果这不合适,请使用代理键(通常是标识列)。您不能使用varchar(max)
。它不是用来存储主键的
找出最长的员工代码,并创建一个覆盖最长案例的大小nvarchar
e、 g.最长员工代码为70个字符,请尝试:-
nvarchar(100)
…只是为了掩饰自己。是的,你是对的。警告!最大密钥长度为900字节。索引PK_uu书签\uuu 2DFA2B0E164452B1
的最大长度为2000字节。对于某些大值组合,插入/更新操作将失败。
不使用varchar(max)
Blob列不能用于索引,它们需要具有固定的大小。它需要是max吗?SQL Server告诉您不能将其作为密钥类型。为什么不把它缩短成有用的内容呢?您的emp_代码列太宽了:对所需大小的猜测;),如果需要全部2GB,该怎么办?@0100011001100001011110010011010这是NVARCHAR(x)
主键的最大可能大小。太好了!!尺寸是个问题。我将它设置为450(最大值),它工作了。谢谢。非常真实的大小限制是900字节的键。另外:即使从技术上讲,你可以将NVARCHAR(450)
列作为主键-如果你碰巧也在表上设置了集群键-你的性能会非常差。您所有的非聚集索引都将是巨大且低效的,您的查询将需要读取比实际需要多得多的页面。一个好的集群键应该很窄-见鬼,我甚至说16字节的GUID太多了!不要使用过大和可变长度的集群键<代码>NVARCHAR(100)
可能更好,考虑到它现在是NVARCHAR
。根据ta的评论进行修改。