[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의 의견을 지적하고 실제로 이것을 필요로한다고 가정하면 유일한 옵션은 다음과 같습니다.
- 키 값의 해시를 사용하십시오
- nchar (40)에 열을 만듭니다 (예 : sha1 해시).
- 해시 열에 고유 키를 넣습니다.
- 레코드를 저장하거나 업데이트 할 때 해시 생성
- 삽입 또는 업데이트시 기존 일치에 대해 테이블을 쿼리하는 트리거입니다.
해싱에는 언젠가 는 충돌 이 발생할 수 있다는 경고가 있습니다 .
트리거는 전체 테이블을 스캔합니다.
너에게 …