একটি প্রকারের যা সূচকগুলিতে কী কলাম হিসাবে ব্যবহারের জন্য অবৈধ


178

আমার একটি ত্রুটি আছে

Column 'key' in table 'misc_info' is of a type that is invalid for use as a key column in an index.

যেখানে কীটি একটি এনভারচার (সর্বোচ্চ)। একটি দ্রুত গুগল এটি পেয়েছে । এটি তবে সমাধান কী তা ব্যাখ্যা করে না। আমি কীভাবে অভিধানের মতো এমন কিছু তৈরি করব যেখানে কী এবং মান উভয় স্ট্রিং এবং স্পষ্টতই কীটি অবশ্যই অনন্য এবং একক হবে। আমার স্কয়ার বিবৃতি ছিল

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

16
4 জিবি বৃহত্তর এবং অনন্য হওয়ার জন্য আপনার কী কী সত্যই প্রয়োজন? স্কেল সার্ভার এটির অনুমতি দেয় না কারণ স্বতন্ত্রতা পরীক্ষা করা সম্ভবত খুব সময়সাপেক্ষ অপারেশন হতে পারে ।
ক্লাউস বাইস্কোভ পেদারসেন

@ ক্লাউসবিস্কভ পিডারসন পোস্টগ্র্রেএসকিউএল এর মতো আরও কিছু শক্তিশালী ডিবিএমএস এটিকে যথেষ্ট পরিমাণে স্মার্ট এবং পরিবর্তে ডাইজেস্টকে সূচী করতে পারেন। তবে আপনার একটা কথা আছে
ম্যাথিউইউ

উত্তর:


242

একটি অনন্য বাধা প্রতি সারিতে 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 টি অক্ষর পর্যন্ত বাড়তে পারে।


1
বারচারের জন্য, সীমাটি কি এখনও ভার্চার হবে (450)?
বাষ্প

9
আপনার varchar(900)OR হয় ব্যবহার করার জায়গা আছে nvarchar(450)
ড্যানিয়েল রেনশওয়া

আমার বোধগম্যতা হল যে কোনও বারচার আইটেমটির দৈর্ঘ্য নির্ধারণ করতে 4 বাইট লাগবে, যার অর্থ আসল সীমাটি বার্চার (896) হওয়া দরকার। এটা কি সঠিক?
mrmillsy

2
@mrmillsy ঘোষিত সর্বাধিক আকারের মধ্যে ওভারহেড (যা 2 বাইট নয়, 4 নয়) এবং ওভারহেড বাইটস সর্বাধিক সূচক সারি আকারের সীমাতে অন্তর্ভুক্ত নয়। টেকনেট.মাইক্রোসফট.ইন- ইউএস
ড্যানিয়েল রেনশো

1
@ মির্মিলসি আপনি সেই বার্তাটি পাচ্ছেন কারণ আপনি ID1 intসূচকে অন্তর্ভুক্ত করছেন। এর intজন্য 900 বাইট ছাড়াও 4 বাইট প্রয়োজন varchar
ড্যানিয়েল রেনশওয়া

33

এসকিউএল সার্ভারে (2008 আর 2 অবধি) সীমাবদ্ধতা রয়েছে যা বার্চর (ম্যাক্স) এবং এনভারচার (ম্যাক্স) (এবং বিভিন্ন ধরণের পাঠ্য, এনটেক্সট) সূচকগুলিতে ব্যবহার করা যায় না। আপনার কাছে দুটি বিকল্প রয়েছে:
1. কী ক্ষেত্রের প্রাক্তনটিতে একটি সীমিত আকার নির্ধারণ করুন। nvarchar (100)
2. সারণীর সমস্ত কীগুলির সাথে মানটির তুলনা করে এমন একটি চেক সীমাবদ্ধতা তৈরি করুন। শর্তটি হ'ল:

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

এবং [ডিবিও] [[চেককি] হ'ল একটি স্কেলার ফাংশন যা হিসাবে সংজ্ঞায়িত হয়:

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

তবে মনে রাখবেন যে নেটিভ সূচকটি চেক সীমাবদ্ধতার চেয়ে বেশি পারফরম্যান্ট তাই যদি না আপনি সত্যিই দৈর্ঘ্য নির্দিষ্ট করতে না পারেন, চেক সীমাবদ্ধতাটি ব্যবহার করবেন না।


চালাক - ট্রিগারগুলির চেয়ে সুন্দর, আমি অনুভব করি।
নিল মস

14

একমাত্র সমাধান হ'ল আপনার অনন্য সূচকে কম ডেটা ব্যবহার করা। আপনার কী সর্বাধিক এনভিচারচার (450) হতে পারে।

"এসকিউএল সার্ভার সমস্ত সূচক কী কলামগুলির সর্বোচ্চ মোট আকারের জন্য 900-বাইট সীমাটি ধরে রাখে।"

আরও পড়ুন এমএসডিএন-এ


বারচারের জন্য, সীমাটি কি এখনও ভার্চার হবে (450)?
বাষ্প


2

আপনার কী দৈর্ঘ্যের আকারের গিগাবাইট হতে হবে এবং ধরে নেওয়া উচিত যে আপনার আসলে এটির প্রয়োজন আছে, তবে আমার মনে হয় আপনার একমাত্র বিকল্পগুলি হ'ল:

  1. কী মানের একটি হ্যাশ ব্যবহার করুন
    • Nchar (40) এ একটি কলাম তৈরি করুন (উদাহরণস্বরূপ একটি sha1 হ্যাশের জন্য),
    • হ্যাশ কলামে একটি অনন্য কী রাখুন।
    • রেকর্ডটি সংরক্ষণ বা আপডেট করার সময় হ্যাশ তৈরি করুন
  2. প্রবেশ বা আপডেটে বিদ্যমান ম্যাচের জন্য টেবিলটি জিজ্ঞাসা করতে ট্রিগার করে।

হ্যাশ সতর্কীকরণ যে এক দিন, আপনি দিয়ে আসে পারে একটি সংঘর্ষের পেতে।

ট্রিগাররা পুরো টেবিলটি স্ক্যান করবে।

আপনার উপর ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.