首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >类型无效,不能用作索引中的键列

类型无效,不能用作索引中的键列
EN

Stack Overflow用户
提问于 2010-05-19 16:46:33
回答 4查看 136.4K关注 0票数 205

我有一个错误,在

代码语言:javascript
复制
Column 'key' in table 'misc_info' is of a type that is invalid for use as a key column in an index.

其中key是nvarchar(max)。在google上快速搜索会发现索引的最大长度是450个字符。然而,这并不能解释什么是解决方案。我如何创建像Dictionary这样的东西,其中键和值都是字符串,显然键必须是唯一的并且是单一的?我的sql语句是

代码语言:javascript
复制
create table [misc_info] (
[id] INTEGER PRIMARY KEY IDENTITY NOT NULL,
[key] nvarchar(max) UNIQUE NOT NULL,
[value] nvarchar(max) NOT NULL);
EN

回答 4

Stack Overflow用户

发布于 2010-05-19 17:03:59

唯一约束不能超过每行8000个字节,即使这样也只使用前900个字节,因此键的最大安全大小为:

代码语言:javascript
复制
create table [misc_info]
( 
    [id] INTEGER PRIMARY KEY IDENTITY NOT NULL, 
    [key] nvarchar(450) UNIQUE NOT NULL, 
    [value] nvarchar(max) NOT NULL
)

即密钥不能超过450个字符。如果您可以切换到varchar而不是nvarchar (例如,如果您不需要存储来自多个代码页的字符),那么这可能会增加到900个字符。

票数 266
EN

Stack Overflow用户

发布于 2010-05-19 17:12:49

SQL Server (直到2008年的R2)中有一个限制,即varchar(MAX)和nvarchar(MAX) (以及其他几种类型,如text、ntext )不能在索引中使用。您有两个选项:

在关键字段ex上设置一个有限的大小。nvarchar(100)创建一个check约束,将该值与表中的所有键进行比较。条件是:

代码语言:javascript
复制
([dbo].[CheckKey]([key])=(1))

dbo.CheckKey是一个标量函数,定义如下:

代码语言:javascript
复制
CREATE FUNCTION [dbo].[CheckKey]
(
    @key nvarchar(max)
)
RETURNS bit
AS
BEGIN
    declare @res bit
    if exists(select * from key_value where [key] = @key)
        set @res = 0
    else
        set @res = 1

    return @res
END

但请注意,原生索引的性能比check约束更好,所以除非确实不能指定长度,否则不要使用check约束。

票数 34
EN

Stack Overflow用户

发布于 2010-05-19 17:03:40

唯一的解决方案是在你的唯一索引中使用更少的数据。您的密钥最多可以是NVARCHAR(450)。

"SQL Server保留所有索引键列的最大总大小的900字节限制。“

有关更多信息,请访问MSDN

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2863993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档