কীভাবে একটি নাল কলামে একটি অনন্য সূচক তৈরি করতে হয়?


101

আমি এসকিউএল সার্ভার 2005 ব্যবহার করছি N আমি একটি কলামের মানগুলিকে অনন্য হতে সীমাবদ্ধ করতে চাই, যখন নুলকে অনুমতি দেই।

আমার বর্তমান সমাধানটি এর মত একটি ভিউতে একটি অনন্য সূচি জড়িত:

CREATE VIEW vw_unq WITH SCHEMABINDING AS
    SELECT Column1
      FROM MyTable
     WHERE Column1 IS NOT NULL

CREATE UNIQUE CLUSTERED INDEX unq_idx ON vw_unq (Column1)

আরও ভাল ধারণা?


16
২০০q সালে স্কয়ার ব্যবহারের কোন সুযোগ নেই? আপনি 'যেখানে' ব্যবহার করে একটি ফিল্টার সূচক তৈরি করতে পারেন
সাইমন_উইভার

3
আপনার অর্থ অনন্য নয়, নুলকে মঞ্জুরি দেওয়ার মাধ্যমে আপনি অনন্য বোঝাচ্ছেন বলে মনে হচ্ছে তবে একাধিক এনএলএলও রয়েছে । অন্যথায়, NULL অন্য যে কোনও মানের মতো সূচিযুক্ত এবং স্বতন্ত্রতা সীমাবদ্ধতা প্রত্যাশার মতো কাজ করে - কেবল এসকিউএল মান অনুযায়ী নয়, @pst নীচে একটি মন্তব্যে উল্লিখিত হিসাবে।
সানক্যাট 2000

উত্তর:


26

খুব নিশ্চিত যে আপনি এটি করতে পারবেন না, কারণ এটি অভাবের উদ্দেশ্য লঙ্ঘন করে।

তবে, এই ব্যক্তির চারপাশে একটি ভাল কাজ হয়েছে বলে মনে হচ্ছে: http://sqlservercodebook.blogspot.com/2008/04/mલ્ટple-null-values-in-unique-index-in.html


2
: এটা আপনি যে লিংক আসলে (আংশিকভাবে) এখান থেকে স্বীকৃতিপ্রদান ছাড়া কপি করা হয়েছে বিষয়বস্তুর বলে মনে হয় decipherinfosys.wordpress.com/2007/11/30/...
টম Juergens

77
আমি একমত নই যে এটি "জ্ঞানগুলির উদ্দেশ্য লঙ্ঘন করে" - এনকিউএল এসকিউএল এর একটি বিশেষ মান (ন্যানের সাথে অনেক উপায়ে অনুরূপ) এবং সেই অনুযায়ী চিকিত্সা করা দরকার। এটি এসকিউএল সার্ভারে বিভিন্ন এসকিউএল স্পেসিফিকেশনকে সম্মান জানাতে আসলে একটি ব্যর্থতা: এখানে "সঠিক বাস্তবায়ন" এর জন্য প্রয়োজনীয় মূল্যগুলির জন্য একটি অনুরোধের জন্য একটি লিঙ্ক: সংযুক্ত.মাইক্রোসফট / এসকিউএল সার্ভার / ফেডব্যাক / ডিটেল / 299229/…

5
২০০৮ এর রেফারেন্সের জন্য আপনি ডিবিও.বার (কী) অনন্য ইন্ডেক্স ফু তৈরি করতে পারেন (কী) কোন কীটি নিখুঁত নয়;
নিকো

2
আমি "জ্ঞানের উদ্দেশ্য লঙ্ঘন" এর সাথেও একমত নই, NULL NULL এর সমান হয় না, তাই আপনাকে নালামযোগ্য কলামে অনন্য সূচক তৈরি করতে এবং একাধিক নাল সন্নিবেশ করতে সক্ষম হওয়া উচিত।
Wodzu

105

এসকিউএল সার্ভার ২০০৮ ব্যবহার করে আপনি একটি ফিল্টারড সূচক তৈরি করতে পারেন: http://msdn.microsoft.com/en-us/library/cc280372.aspx । (আমি দেখেছি সাইমন এটিকে একটি মন্তব্য হিসাবে যুক্ত করেছেন, তবে ভেবেছিলেন যে মন্তব্যটি সহজেই মিস হয়েছে বলে এটি নিজের উত্তরটির প্রাপ্য।

আর একটি বিকল্প স্বতন্ত্রতা পরীক্ষা করতে একটি ট্রিগার, কিন্তু এটি কর্মক্ষমতা প্রভাবিত করতে পারে।


84
create unique index UIX on MyTable (Column1) where Column1 is not null
জার্ন শো-রোড

1
দ্রষ্টব্য: বর্তমানে এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে এই জাতীয় সূচিগুলি কীভাবে তৈরি করা হবে তা জানেন না বলে আপনি পরে যদি সারণিটি সংশোধন করেন তবে এটি বিভ্রান্ত হয়ে
পড়বে

3
মনে হচ্ছে মাইক্রোসফ্ট এসএসএমএস আপডেট করেছে এটি সমর্থন করার জন্য। আমার এসএসএমএস 10.50.1617 রয়েছে এবং সূচক বৈশিষ্ট্য সংলাপে আপনি ফিল্টার সম্পাদনা করতে ফিল্টার পৃষ্ঠা নির্বাচন করতে পারেন। উদাহরণস্বরূপ "([কলাম 1] নুল নয়)"
ফিল হাসেল্ডেন

5
কোনও সূচকে একাধিক নাল ব্যবহার করা এবং সূচি থেকে নালগুলি ফিল্টার করা পৃথক জিনিস। একটি সূচক ফিল্টারিং প্রকৃতপক্ষে সূচী থেকে রেকর্ড বাদ দেয়, অন্য সমাধানগুলি নালকে একটি দরকারী অনন্য মানের রূপান্তরিত করে। পার্থক্য সম্পর্কে সচেতন হন।
সানক্যাট 2000

আপনি যদি একটি ফিল্টার সূচক যে ভালো সঙ্গে একটি টেবিল সঞ্চিত পদ্ধতি ব্যবহার করেন, তাহলে নিশ্চিত যে ANSI_NULLSহয় ON, অন্যথায় আপনি একটি ত্রুটি পাবেন যখন ডেটা সন্নিবেশ করার চেষ্টা করছে।
আর্ন

71

গণনাকৃত কলাম কৌশলটি "নালবাসার" হিসাবে ব্যাপকভাবে পরিচিত; আমার নোটগুলি ক্রেডিট স্টিভ কাস:

CREATE TABLE dupNulls (
pk int identity(1,1) primary key,
X  int NULL,
nullbuster as (case when X is null then pk else 0 end),
CONSTRAINT dupNulls_uqX UNIQUE (X,nullbuster)
)

এটিকে দুর্দান্ত কৌশল বলে মনে হচ্ছে। অদ্ভুতভাবে নালবুস্টার অনুসন্ধান করা খুব বেশি স্টাফ নিয়ে আসে না। আমি ভাবছি যে অনুসন্ধানগুলিও ত্বরান্বিত করার জন্য এটি কার্যকর হবে - কেবল 1 এবং 0 এর গণনা কলামের চেয়ে নাল বা না, যদি পিকে ব্যবহার করে সূচকে আরও কিছু দিয়ে কাজ করে? একটি বড় টেবিলে এই সপ্তাহান্তে পরীক্ষা করতে যাচ্ছেন এবং দেখুন।
ডেভিড স্টোরফার

@ ডেভিডস্টোরফার, আপনি এটি করতে পারবেন না কারণ আপনার দুটি ভিন্ন সারণির আইডির মধ্যে সংঘর্ষ হতে পারে।
ব্যবহারকারী 39323274

উন্নতি: ইসনুল (এক্স, কনভার্ট (ভর্চার (10), পিকে))
ফয়েজ

5
@ ফাইজ: উন্নতি দর্শকের চোখে পড়ে। আমি আসল চেহারা পছন্দ।
onedaywhen

@ ননোগ, এটি আপনার গ্রহণযোগ্য উত্তর হওয়া উচিত কারণ এটি কোনও বাহ্যিক সাইটকে সংযুক্ত না করে কেবল অদৃশ্য হয়ে যাওয়ার পরিবর্তে আপনার প্রয়োজনীয়তার সাথে সামঞ্জস্যপূর্ণ একটি ভাল সমাধান সরবরাহ করে।
ফ্রিডারিক

-3

কড়া কথায় বলতে গেলে, একটি অনন্য কলাম কলাম (বা কলামগুলির সেট) কেবল একবারে NULL (বা NULL এর একটি রেকর্ড) হতে পারে, যেহেতু একই মান (এবং এটিতে NULL অন্তর্ভুক্ত) একাধিকবার স্পষ্টতই অনন্য সীমাবদ্ধতা লঙ্ঘন করে।

তবে, এর অর্থ এই নয় যে "অনন্য nullable কলাম" ধারণাটি বৈধ; এটি যে কোনও রিলেশনাল ডাটাবেসে বাস্তবায়িত করার জন্য আমাদের কেবল মনে রাখতে হবে যে এই ধরণের ডাটাবেসগুলি সঠিকভাবে কাজ করার জন্য সাধারণকরণ হিসাবে বোঝানো হয়েছে, এবং সাধারণীকরণ সাধারণত সত্ত্বার মধ্যে সম্পর্ক স্থাপনের জন্য বিভিন্ন (অ-সত্তা) অতিরিক্ত টেবিল যুক্ত করে থাকে ।

আসুন কেবলমাত্র একটি "অনন্য nullable কলাম" বিবেচনা করে একটি বেসিক উদাহরণ কাজ করুন, এটি আরও এই জাতীয় কলামগুলিতে প্রসারিত করা সহজ।

মনে করুন আমরা কোনও টেবিলে প্রতিনিধিত্ব করে তথ্যগুলি:

create table the_entity_incorrect
(
  id integer,
  uniqnull integer null, /* we want this to be "unique and nullable" */
  primary key (id)
);

আমরা ইউনিকুলকে আলাদা করে রেখে এবং এককনুল মান এবং the_entity (একচেটিয়া "the_entity এর ভিতরে" এককনাল থাকার চেয়ে) সম্পর্ক স্থাপনের জন্য একটি দ্বিতীয় সারণী যুক্ত করে এটি করতে পারি:

create table the_entity
(
  id integer,
  primary key(id)
);

create table the_relation
(
  the_entity_id integer not null,
  uniqnull integer not null,

  unique(the_entity_id),
  unique(uniqnull),
  /* primary key can be both or either of the_entity_id or uniqnull */
  primary key (the_entity_id, uniqnull), 
  foreign key (the_entity_id) references the_entity(id)
);

ইউনিট-এর মানটিকে একটি সারিতে একটি_ সারিবদ্ধভাবে সংযুক্ত করার জন্য আমাদেরও_সংশ্লিষ্টতার মধ্যে একটি সারি যুক্ত করতে হবে।

The_entity এর সারিগুলির জন্য কোনও অদ্বিতীয় মান যুক্ত ছিল না (যেমন আমরা সেই_উত্তর_অনুষ্ঠানে NULL রাখব) তার জন্য আমরা কেবল_সংশ্লিষ্টতার সাথে একটি সারি যুক্ত করি না।

নোট করুন যে ইউনিকুলের জন্য মানগুলি সমস্ত_সম্পর্ক সম্পর্কিত স্বতন্ত্র হবে এবং এটিও লক্ষ্য করুন যে_েনটিটির প্রতিটি মানের ক্ষেত্রে_আরলেশনটিতে সর্বাধিক এক মান থাকতে পারে, যেহেতু এটিতে প্রাথমিক এবং বিদেশী কীগুলি এটি প্রয়োগ করে।

তারপরে, ইউনিকনুলের জন্য যদি 5 এর মান 3 এর একটি_পরিচয় আইডির সাথে যুক্ত করা হয়, আমাদের প্রয়োজন:

start transaction;
insert into the_entity (id) values (3); 
insert into the_relation (the_entity_id, uniqnull) values (3, 5);
commit;

এবং, যদি # ইন্টিটিটির জন্য 10 এর আইডি মানটির কোনও স্বতন্ত্র অংশ না থাকে তবে আমরা কেবল এটিই করি:

start transaction;
insert into the_entity (id) values (10); 
commit;

এই তথ্যটিকে অস্বীকৃতি জানাতে এবং ডাটা_তন্ত্রের মতো একটি সারণী যে তথ্যটি ধরে রাখবে তা পেতে, আমাদের এগুলি করতে হবে:

select
  id, uniqnull
from
  the_entity left outer join the_relation
on
  the_entity.id = the_relation.the_entity_id
;

"বাম বাহিরের জোড়" অপারেটর নিশ্চিত করে যে_আরটিটি থেকে সমস্ত সারি ফলাফলের মধ্যে উপস্থিত হবে, যখন এনআরএলকে এককনুল কলামে রাখবে যখন কোনও মিল নেই কলামগুলি_আরলেশনে উপস্থিত না থাকে।

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


6
পঞ্চাশটি উর্ধ্বগতির সাথে গৃহীত উত্তরের মন্তব্যে ইতিমধ্যে যেমনটি বলা হয়েছে, এটি এমএস এসকিএল সার্ভারকে অনন্য হিসাবে সূচিত একটি কলামে একাধিক নাল রাখার জন্য সমর্থন করা উচিত। এটি এসকিউএল স্ট্যান্ডার্ড প্রয়োগ না করা ব্যর্থতা। নাল একটি মান নয়, নাল শূন্যের সমান নয়, বছরের পর বছর থেকে এটি একটি প্রাথমিক এসকিউএল নিয়ম। সুতরাং আপনার প্রথম বাক্যটি ভুল এবং বেশিরভাগ পাঠকই পড়তে বিরক্ত করবেন না।
ফ্রেডেরিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.