[sql] 인덱스에서 키 열로 사용할 수없는 유형입니다.

에 오류가 있습니다

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)입니다. 빠른 구글 이 이것을 찾았습니다 . 그러나 솔루션이 무엇인지 설명하지는 않습니다. 키와 값이 모두 문자열이고 키가 고유하고 단일 해야하는 사전과 같은 것을 어떻게 만들 수 있습니까? 내 SQL 문은

create table [misc_info] (
[id] INTEGER PRIMARY KEY IDENTITY NOT NULL,
[key] nvarchar(max) UNIQUE NOT NULL,
[value] nvarchar(max) NOT NULL);



답변

고유 제한 조건은 행당 8000 바이트를 초과 할 수 없으며 처음 900 바이트 만 사용하므로 키의 가장 안전한 최대 크기는 다음과 같습니다.

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 자로 증가 할 수 있습니다.


답변

SQL Server (2008 R2까지)에는 varchar (MAX) 및 nvarchar (MAX) (및 text, ntext와 같은 여러 다른 유형)를 인덱스에 사용할 수 없다는 제한이 있습니다. 다음 두 가지 옵션이 있습니다.
1. 키 필드에서 제한된 크기를 설정하십시오. 예. nvarchar (100)
2. 값을 테이블의 모든 키와 비교하는 검사 제한 조건을 작성하십시오. 조건은 다음과 같습니다.

([dbo].[CheckKey]([key])=(1))

그리고 [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

그러나 기본 인덱스는 검사 제한 조건보다 성능이 뛰어나므로 실제로 길이를 지정할 수 없으면 검사 제한 조건을 사용하지 마십시오.


답변

유일한 해결책은 고유 색인에서 더 적은 데이터를 사용하는 것입니다. 키는 최대 NVARCHAR (450) 일 수 있습니다.

“SQL Server는 모든 인덱스 키 열의 최대 총 크기에 대한 900 바이트 제한을 유지합니다.”

MSDN 에서 더 읽어보기


답변

해결책은 키를로 선언하는 것 nvarchar(20)입니다.


답변

키 길이가 기가 바이트이어야한다는 사실에 대한 klaisbyskov의 의견을 지적하고 실제로 이것을 필요로한다고 가정하면 유일한 옵션은 다음과 같습니다.

  1. 키 값의 해시를 사용하십시오
    • nchar (40)에 열을 만듭니다 (예 : sha1 해시).
    • 해시 열에 고유 키를 넣습니다.
    • 레코드를 저장하거나 업데이트 할 때 해시 생성
  2. 삽입 또는 업데이트시 기존 일치에 대해 테이블을 쿼리하는 트리거입니다.

해싱에는 언젠가 는 충돌 이 발생할 수 있다는 경고가 있습니다 .

트리거는 전체 테이블을 스캔합니다.

너에게 …


답변