는 인덱스에서 키 열로 사용할 수 없는 유형입니다.
에 오류가 있습니다.
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)입니다.빠른 구글 검색 결과 인덱스의 최대 길이는 450자입니다.하지만, 이것이 해결책이 무엇인지 설명해주지는 않습니다.키와 값이 모두 문자열이고 키가 고유해야 하며 단일해야 하는 사전과 같은 것을 만들려면 어떻게 해야 합니까?나의 sql문은
create table [misc_info] (
[id] INTEGER PRIMARY KEY IDENTITY NOT NULL,
[key] nvarchar(max) UNIQUE NOT NULL,
[value] nvarchar(max) NOT NULL);
고유한 제약 조건은 행당 8,000바이트를 초과할 수 없으며, 그런 경우에도 처음 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. 키 필드 ex 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 해시의 경우).
- 해시 열에 고유 키를 넣습니다.
- 레코드를 저장하거나 업데이트할 때 해시 생성
- 삽입 또는 업데이트 시 기존 일치 항목에 대해 테이블을 쿼리합니다.
언젠가 충돌할 수도 있다는 경고와 함께 해싱이 옵니다.
트리거는 전체 테이블을 스캔합니다.
당신 쪽으로...
언급URL : https://stackoverflow.com/questions/2863993/is-of-a-type-that-is-invalid-for-use-as-a-key-column-in-an-index
'programing' 카테고리의 다른 글
| SQL providerweb.config의 이름 (0) | 2023.09.06 |
|---|---|
| 약속 가져오기 본문 읽기 (0) | 2023.09.06 |
| my gitlab-ci에서 주상 mariadb 서비스를 추가하는 방법 (0) | 2023.09.06 |
| Powershell 스크립트를 사용하여 IISRESET을 수행하는 방법 (0) | 2023.09.06 |
| HTML/PHP - 양식 - 배열로 입력 (0) | 2023.09.06 |