164 sql sql-server-2008
我有一个错误
Column 'key' in table 'misc_info' is of a type that is invalid for use as a key column in an index.
Run Code Online (Sandbox Code Playgroud)
其中key是nvarchar(max).一个快速谷歌发现了这一点.然而,它并没有解释什么是解决方案.我如何创建像Dictionary这样的键,其中键和值都是字符串,显然键必须是唯一的并且是单一的.我的sql语句是
create table [misc_info] (
[id] INTEGER PRIMARY KEY IDENTITY NOT NULL,
[key] nvarchar(max) UNIQUE NOT NULL,
[value] nvarchar(max) NOT NULL);
Run Code Online (Sandbox Code Playgroud)
Dan*_*haw 226
唯一约束不能超过每行8000个字节,即使这样也只能使用前900个字节,所以最安全的最大大小是:
create table [misc_info]
(
[id] INTEGER PRIMARY KEY IDENTITY NOT NULL,
[key] nvarchar(450) UNIQUE NOT NULL,
[value] nvarchar(max) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
即密钥不能超过450个字符.如果可以切换到varchar而不是nvarchar(例如,如果您不需要存储来自多个代码页的字符)那么可以增加到900个字符.
Mar*_*wan 33
SQL Server(直到2008 R2)存在一个限制,即varchar(MAX)和nvarchar(MAX)(以及其他几种类型,如text,ntext)不能在索引中使用.您有2个选项:
1.在关键字段ex上设置有限大小.nvarchar(100)
2.创建一个检查约束,将值与表中的所有键进行比较.条件是:
([dbo].[CheckKey]([key])=(1))
Run Code Online (Sandbox Code Playgroud)
和[dbo].[CheckKey]是一个标量函数,定义如下:
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
Run Code Online (Sandbox Code Playgroud)
但请注意,本机索引比检查约束更高效,因此除非您确实无法指定长度,否则请勿使用检查约束.
归档时间: |
|
查看次数: |
96895 次 |
最近记录: |