Saya memiliki kesalahan di
Column 'key' in table 'misc_info' is of a type that is invalid for use as a key column in an index.
di mana kuncinya adalah nvarchar (maks). Google cepat menemukan ini . Namun itu tidak menjelaskan apa solusinya. Bagaimana cara membuat sesuatu seperti Kamus di mana kunci dan nilainya adalah string dan jelas kuncinya harus unik dan tunggal. Pernyataan sql saya adalah
create table [misc_info] (
[id] INTEGER PRIMARY KEY IDENTITY NOT NULL,
[key] nvarchar(max) UNIQUE NOT NULL,
[value] nvarchar(max) NOT NULL);
Jawaban:
Batasan unik tidak boleh lebih dari 8000 byte per baris dan hanya akan menggunakan 900 byte pertama, jadi ukuran maksimum teraman untuk kunci Anda adalah:
yaitu kuncinya tidak boleh lebih dari 450 karakter. Jika Anda dapat beralih ke
varchar
alih-alihnvarchar
(mis. Jika Anda tidak perlu menyimpan karakter dari lebih dari satu codepage) maka itu dapat meningkat menjadi 900 karakter.sumber
varchar(900)
ORnvarchar(450)
.ID1 int
dalam indeks. Ituint
membutuhkan 4 byte, selain 900 byte untukvarchar
.Ada batasan dalam SQL Server (hingga 2008 R2) bahwa varchar (MAX) dan nvarchar (MAX) (dan beberapa jenis lain seperti teks, ntext) tidak dapat digunakan dalam indeks. Anda memiliki 2 opsi:
1. Tetapkan ukuran terbatas pada bidang kunci, mis. nvarchar (100)
2. Buat batasan pemeriksaan yang membandingkan nilai dengan semua kunci di tabel. Syaratnya adalah:
dan [dbo]. [CheckKey] adalah fungsi skalar yang didefinisikan sebagai:
Tetapi perhatikan bahwa indeks asli lebih berkinerja daripada kendala pemeriksaan jadi kecuali Anda benar-benar tidak dapat menentukan panjang, jangan gunakan kendala periksa.
sumber
Satu-satunya solusi adalah dengan menggunakan lebih sedikit data dalam Indeks Unik Anda. Kunci Anda paling banyak NVARCHAR (450).
"SQL Server mempertahankan batas 900-byte untuk ukuran total maksimum semua kolom kunci indeks."
Baca lebih lanjut di MSDN
sumber
Sebuah solusi akan menyatakan kunci Anda sebagai
nvarchar(20)
.sumber
Memperhatikan komentar klaisbyskov tentang panjang kunci Anda harus berukuran gigabytes, dan dengan asumsi bahwa Anda memang membutuhkannya, maka saya pikir satu-satunya pilihan Anda adalah:
Hashing datang dengan peringatan bahwa suatu hari, Anda mungkin mendapatkan tabrakan.
Pemicu akan memindai seluruh tabel.
Ke Anda...
sumber