আমি কীভাবে একটি অনন্য বাধা তৈরি করব যা শূন্য করতে দেয়?


618

আমি একটি কলামে একটি অনন্য প্রতিবন্ধকতা থাকতে চাই যা আমি জিইউইডিএস দিয়ে পপুলেশন করতে যাচ্ছি। তবে, আমার ডেটাতে এই কলামগুলির জন্য নাল মান রয়েছে contains আমি কীভাবে সীমাবদ্ধতা তৈরি করব যা একাধিক নাল মানকে অনুমতি দেয়?

এখানে একটি উদাহরণ দৃশ্য । এই স্কিমা বিবেচনা করুন:

CREATE TABLE People (
  Id INT CONSTRAINT PK_MyTable PRIMARY KEY IDENTITY,
  Name NVARCHAR(250) NOT NULL,
  LibraryCardId UNIQUEIDENTIFIER NULL,
  CONSTRAINT UQ_People_LibraryCardId UNIQUE (LibraryCardId)
)

তারপরে আমি যা অর্জন করতে চাইছি তার জন্য এই কোডটি দেখুন:

-- This works fine:
INSERT INTO People (Name, LibraryCardId) 
 VALUES ('John Doe', 'AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA');

-- This also works fine, obviously:
INSERT INTO People (Name, LibraryCardId) 
VALUES ('Marie Doe', 'BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB');

-- This would *correctly* fail:
--INSERT INTO People (Name, LibraryCardId) 
--VALUES ('John Doe the Second', 'AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA');

-- This works fine this one first time:
INSERT INTO People (Name, LibraryCardId) 
VALUES ('Richard Roe', NULL);

-- THE PROBLEM: This fails even though I'd like to be able to do this:
INSERT INTO People (Name, LibraryCardId) 
VALUES ('Marcus Roe', NULL);

চূড়ান্ত বিবৃতি একটি বার্তা দিয়ে ব্যর্থ:

'ইউকিউপিপুলি_ লাইবারিকার্ডআইডি' অনন্য কী বাধা লঙ্ঘন। 'Dbo.People' অবজেক্টে সদৃশ কী sertোকানো যায় না।

আমি কীভাবে আমার স্কিমা এবং / বা স্বতন্ত্রতা সীমাবদ্ধতা পরিবর্তন করতে পারি যাতে এটি একাধিক NULLমানকে মঞ্জুরি দেয় , যখন এখনও প্রকৃত ডেটার স্বাতন্ত্র্য পরীক্ষা করে?


ভোট দেওয়ার জন্য মানক সামঞ্জস্যের জন্য ইস্যুটি সংযুক্ত করুন: সংযুক্ত.মাইক্রোসফট
এসকিউএলএসবার


অনন্য প্রতিবন্ধকতা এবং NULL অনুমতি দিন। ? এটা সাধারণ জ্ঞান। এটি সম্ভব নয়
ফ্ল্যাশ

13
@ ফ্লিক, "সাধারণ জ্ঞান" উল্লেখ না করাই ভাল। এটি কোনও বৈধ যুক্তি নয়। বিশেষত এটি বিবেচনা করার সময় nullকোনও মূল্য নয় তবে মানটির অনুপস্থিতি। এসকিউএল মান অনুযায়ী, এর nullসমান বিবেচনা করা হয় না null। সুতরাং কেন একাধিক nullহওয়া উচিত একটি স্বতন্ত্রতা লঙ্ঘন?
ফ্রেডেরিক

উত্তর:


144

এসকিউএল সার্ভার ২০০৮

আপনি একটি অনন্য সূচক তৈরি করতে পারেন যা একটি WHEREধারা সহ একাধিক NULL গ্রহণ করে । দেখুন নিচের উত্তর

এসকিউএল সার্ভার ২০০৮ এর আগে

আপনি একটি স্বতন্ত্র সীমাবদ্ধতা তৈরি করতে পারবেন না এবং NULL গুলি মঞ্জুরি দিতে পারবেন না। আপনাকে NEWID () এর একটি ডিফল্ট মান সেট করতে হবে।

বিদ্যমান মানগুলিকে NEWID () এ আপডেট করুন যেখানে অনন্য সীমাবদ্ধতা তৈরি করার আগে NULL হয়।


2
এবং এটি পূর্ববর্তী অবস্থানগুলিতে বিদ্যমান সারিগুলিতে মানগুলি যুক্ত করবে, তাই যদি আমাকে এই কাজটি করা দরকার, ধন্যবাদ?
স্টুয়ার্ট

1
বিদ্যমান মানগুলি NEWID () এ সেট করার জন্য আপনাকে একটি আপডেটের বিবরণী চালাতে হবে যেখানে বিদ্যমান ক্ষেত্রটি শূন্য
জোসে বাসিলিও

54
আপনি যদি এসকিউএল সার্ভার ২০০৮ বা তার পরের ব্যবহার করছেন তবে 100 টিরও বেশি আপগেট সহ নীচের উত্তরটি দেখুন। আপনি আপনার স্বতন্ত্র সীমাবদ্ধতার জন্য যেখানে একটি দফা যুক্ত করতে পারেন।
ড্যারেন গ্রিফিথ

1
এটি খুব সমস্যা ADO.NET ডেটা টেবিলকেও হিট করে। এমনকি আমি এই পদ্ধতিটি ব্যবহার করে ব্যাকিং ফিল্ডে নালার অনুমতি দিতে পারি, ডেটা টেবিল আমাকে প্রথমে কোনও অনন্য কলামে নুলগুলি সংরক্ষণ করতে দেয় না। যদি কেউ এর জন্য কোনও সমাধান জানেন তবে দয়া করে এটি এখানে
ডটনেট

6
ছেলেরা নিশ্চিত করুন যে আপনি নিচে স্ক্রোল করেছেন এবং 600 টি upvotes সহ উত্তরটি পড়ছেন। এটি এখন আর 100 এর বেশি নয়
আলোকিত

1285

আপনি যা সন্ধান করছেন তা প্রকৃতপক্ষে এএনএসআই মানক এসকিউএল: ৯২, এসকিউএল: ১৯৯৯ এবং এসকিউএল: ২০০৩ এর একটি অংশ, অর্থাত্ একটি অনন্য বাধা অবশ্যই নন-নুল মানগুলি বর্জন করতে হবে তবে একাধিক নূন্য মান গ্রহণ করবে।

মাইক্রোসফ্টের এসকিউএল সার্ভারের জগতে, একটি একক নূলে অনুমতি দেওয়া হয়েছে তবে একাধিক নূলে নেই ...

ইন এসকিউএল সার্ভার 2008 , আপনি যে বাদ NULLs মানের একটি বিধেয় উপর ভিত্তি করে একটি অনন্য ফিল্টার করা সূচক নির্ধারণ করতে পারেন:

CREATE UNIQUE NONCLUSTERED INDEX idx_yourcolumn_notnull
ON YourTable(yourcolumn)
WHERE yourcolumn IS NOT NULL;

পূর্ববর্তী সংস্করণগুলিতে, আপনি সীমাবদ্ধতা প্রয়োগের জন্য নূন নালিকের পূর্বাভাস সহ ভিউউস অবলম্বন করতে পারেন।


3
এটি সম্ভবত এটি করার সেরা উপায়। কোনও কার্যকারিতা প্রভাব আছে কিনা তা নিশ্চিত নন? যে কেউ?
সাইমন_উইভার

3
আমি এসকিউএল সার্ভার ২০০৮ এক্সপ্রেস সংস্করণে ঠিক এটি করার চেষ্টা করছি এবং নিম্নরূপে আমি একটি ত্রুটি পেয়েছি: [এসএলএস-সিপি] অন। স্তর 15, রাজ্য 1, লাইন 3 'WHERE' মূলশব্দটির নিকটে ভুল সিনট্যাক্স। যদি আমি ডিডিএলটি দুর্দান্তভাবে চালিত যেখানে সারণিটি সরিয়ে ফেলি তবে অবশ্যই, আমার যা প্রয়োজন তা না করে। কোন ধারনা?
কেনেথ বাল্ট্রিনিক

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

8
সত্যই একটি দুর্দান্ত উত্তর। খুব খারাপ এটি উত্তর হিসাবে গৃহীত দ্বারা লুকিয়েছিল। এই সমাধানটি প্রায় আমার নজরে আসে নি, তবে এটি এখন আমার বাস্তবায়নে বিস্ময়ের মতো কাজ করে।
প্রবাল ডো 2

2
এসকিউএল 2005 এবং এর নীচে অন্য বিকল্পটি একটি গণনাকারী কলাম ওরফে "নুলবাস্টার" কৌশল। stackoverflow.com/a/191729/132461 এটি আপনাকে অন্য ভিউ দিয়ে ডাটাবেস গোলমাল থেকে বাঁচায়, তার পরিবর্তে আপনার আরও একটি কলাম রয়েছে - সাধারণত কলামা-নলবাস্টার নামকরণ করা হয় যদি কলামআমাকে আপনি এএনএসআই-র অবিচ্ছেদ্য ইউনিক হতে চান। কলামএ-নলবাস্টারে একটি অনন্য সূচক (বা ব্যবসায়ের অভিপ্রায় প্রকাশের সীমাবদ্ধতা) রাখুন এবং এটি কলামে স্বতন্ত্রতা প্রয়োগ করবে
ড্যানো

34

এসকিউএল সার্ভার ২০০৮ এবং তারপরে

কেবল একটি অনন্য সূচক ফিল্টার করুন:

CREATE UNIQUE NONCLUSTERED INDEX UQ_Party_SamAccountName
ON dbo.Party(SamAccountName)
WHERE SamAccountName IS NOT NULL;

নিম্ন সংস্করণগুলিতে, এখনও একটি বস্তুগত দর্শন প্রয়োজন হয় না

এসকিউএল সার্ভার 2005 এবং এর আগের জন্য, আপনি এটি কোনও দর্শন ছাড়াই করতে পারেন। আপনি আমার টেবিলে যে কোনওটিকে চাইছেন বলে আমি কেবল একটি অনন্য বাধা যুক্ত করেছি। আমি কলামে স্বতন্ত্রতা চাই SamAccountName, কিন্তু আমি একাধিক এনএলএলকে অনুমতি দিতে চাই, আমি বস্তুগত দৃশ্যের পরিবর্তে একটি বস্তুযুক্ত কলাম ব্যবহার করেছি:

ALTER TABLE dbo.Party ADD SamAccountNameUnique
   AS (Coalesce(SamAccountName, Convert(varchar(11), PartyID)))
ALTER TABLE dbo.Party ADD CONSTRAINT UQ_Party_SamAccountName
   UNIQUE (SamAccountNameUnique)

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

Coalesce('n' + SamAccountName, 'p' + Convert(varchar(11), PartyID))

এমনকি যদি PartyIDকোনও দিন অ-সংখ্যাসূচক হয়ে যায় এবং এটি একটির সাথে মিলিত হতে পারে তবে SamAccountNameএখন এটি কোনও বিষয় নয়।

নোট করুন যে গণনা কলাম সহ একটি সূচকের উপস্থিতি স্পষ্টতই প্রতিটি অভিব্যক্তির ফলাফলকে টেবিলের অন্যান্য ডেটার সাথে ডিস্কে সংরক্ষণ করতে পারে, যা অতিরিক্ত ডিস্কের জায়গা নেয়।

মনে রাখবেন যে আপনি যদি কোনও সূচি চান না, আপনি PERSISTEDকলাম এক্সপ্রেশন সংজ্ঞাটির শেষে কীওয়ার্ড যুক্ত করে ডিস্কে এক্সপ্রেশনটিকে প্রাক্কলকুলেটেড করে সিপিইউ সংরক্ষণ করতে পারেন ।

এসকিউএল সার্ভার ২০০৮ এবং তারপরে, সম্ভবত আপনি যদি পারেন তবে এর পরিবর্তে অবশ্যই ফিল্টারযুক্ত সমাধানটি ব্যবহার করুন!

বিতর্ক

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

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

সুতরাং, আমার গল্পটি হ'ল এটি কোনও সারোগেট নুল নয়, এবং আমি এটির সাথে লেগে আছি! যেহেতু আমরা UNIQUEসূচককে NULL উপেক্ষা করার জন্য অন্য কোনও উদ্দেশ্যে নন-নুল মানটি প্রকৃতপক্ষে চাই না , আমাদের ব্যবহারের ক্ষেত্রে সাধারণ সরোজেট ন্যূনাল ক্রিয়েশন নিয়ে যে সমস্যা দেখা দেয় তার কোনওটিই নেই।

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

হালনাগাদ

যদি আপনার কলামটি সংখ্যাসূচক হয়, তবে অনন্য সীমাবদ্ধতা ব্যবহারের Coalesceফলে সংঘর্ষের ফলস্বরূপ না তা নিশ্চিত করার চ্যালেঞ্জ হতে পারে । সেক্ষেত্রে কিছু বিকল্প রয়েছে। একটি ".ণাত্মক নম্বর" কেবলমাত্র নেতিবাচক সীমার মধ্যে রাখার জন্য, এবং "সত্যিকারের মানগুলি" কেবল ধনাত্মক পরিসরে ব্যবহার করার জন্য একটি নেতিবাচক সংখ্যা ব্যবহার করা যেতে পারে। পর্যায়ক্রমে, নিম্নলিখিত প্যাটার্ন ব্যবহার করা যেতে পারে। সারণীতে Issue(কোথায় IssueIDরয়েছে PRIMARY KEY) একটি থাকতে পারে বা নাও থাকতে পারে TicketIDতবে যদি তা থাকে তবে তা অবশ্যই অনন্য।

ALTER TABLE dbo.Issue ADD TicketUnique
   AS (CASE WHEN TicketID IS NULL THEN IssueID END);
ALTER TABLE dbo.Issue ADD CONSTRAINT UQ_Issue_Ticket_AllowNull
   UNIQUE (TicketID, TicketUnique);

যদি ইস্যুআইডি 1 এর টিকিট 123 থাকে তবে UNIQUEসীমাবদ্ধতা মানগুলিতে হবে (123, NULL)। যদি ইস্যুআইডি 2 এর কোনও টিকিট না থাকে তবে তা চালু থাকবে (NULL, 2)। কিছু ভাবা দেখিয়ে দেবে যে এই সীমাবদ্ধতাটি টেবিলের কোনও সারির জন্য নকল করা যাবে না এবং এখনও একাধিক NULL অনুমতি দেয়।


16

মাইক্রোসফ্ট এসকিউএল সার্ভার ম্যানেজার ব্যবহার করছেন এবং একটি অনন্য তবে নলযোগ্য সূচক তৈরি করতে চান এমন লোকদের জন্য আপনি নিজের অনন্য সূচকটি তৈরি করতে পারেন যেমন আপনি সাধারণত আপনার নতুন সূচকের জন্য আপনার সূচক বৈশিষ্ট্যে, বাম হাতের প্যানেল থেকে "ফিল্টার" নির্বাচন করুন, তারপরে প্রবেশ করুন আপনার ফিল্টার (যা আপনার যেখানে ক্লজ) এটি এমন কিছু পড়তে হবে:

([YourColumnName] IS NOT NULL)

এটি এমএসএসকিউএল 2012 এর সাথে কাজ করে


মাইক্রোসফ্ট এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওর অধীনে ফিল্টারড ইনডেক্সটি
জানুয়ারী

9

যখন আমি নীচের অনন্য সূচকটি প্রয়োগ করি:

CREATE UNIQUE NONCLUSTERED INDEX idx_badgeid_notnull
ON employee(badgeid)
WHERE badgeid IS NOT NULL;

প্রতিটি নন আপডেট এবং সন্নিবেশ নীচের ত্রুটি সহ ব্যর্থ হয়েছে:

আপডেট ব্যর্থ হয়েছে কারণ নিম্নলিখিত SET বিকল্পগুলির ভুল সেটিংস রয়েছে: 'এরিটিএইচবিআর্ট'।

আমি এটি এমএসডিএন- তে পেয়েছি

আপনি যখন গণিত কলাম বা সূচী দর্শনগুলিতে সূচিগুলি তৈরি বা পরিবর্তন করছেন তখন অবশ্যই সেট এথ্যাববার্ট চালু থাকতে হবে। যদি সেট এরিচাবার্ট অফ থাকে, তৈরি করুন, আপডেট করুন, সংযোজন করুন, এবং সংযুক্ত কলামে বা সূচী দর্শনগুলিতে সূচী সহ টেবিলগুলিতে বিবৃতি মুছে ফেলবেন।

সুতরাং এটি সঠিকভাবে কাজ করতে আমি এটি করেছি

[ডাটাবেস] -> বৈশিষ্ট্য -> বিকল্পগুলি -> অন্যান্য বিকল্প -> বিবিধ -> পাটিগণিত বন্ধন সক্ষম -> সত্য এ ডান ক্লিক করুন

আমি বিশ্বাস করি কোড ব্যবহার করে এই বিকল্পটি সেট করা সম্ভব

ALTER DATABASE "DBNAME" SET ARITHABORT ON

তবে আমি এটি পরীক্ষা করিনি


6

এমন একটি ভিউ তৈরি করুন যা কেবল অ- NULLকলামগুলি নির্বাচন করে এবং ভিউটিতে তৈরি করুন UNIQUE INDEX:

CREATE VIEW myview
AS
SELECT  *
FROM    mytable
WHERE   mycolumn IS NOT NULL

CREATE UNIQUE INDEX ux_myview_mycolumn ON myview (mycolumn)

মনে রাখবেন যে আপনাকে টেবিলের পরিবর্তে ভিউতে 'গুলি INSERT' করতে হবে UPDATE

আপনি এটি একটি INSTEAD OFট্রিগার দিয়ে করতে পারেন :

CREATE TRIGGER trg_mytable_insert ON mytable
INSTEAD OF INSERT
AS
BEGIN
        INSERT
        INTO    myview
        SELECT  *
        FROM    inserted
END

সুতরাং ভিউতে sertোকানোর জন্য আমার ডালটি পরিবর্তন করা দরকার?
স্টুয়ার্ট

1
আপনি INSTERAD INSERT এ ট্রিগার তৈরি করতে পারেন।
কাসসনোই

6

এটি ডিজাইনারেও করা যেতে পারে

এই উইন্ডোটি পেতে সূচক> বৈশিষ্ট্যে ডান ক্লিক করুন

গ্রেপ্তার


আপনি যদি ডিজাইনারের অ্যাক্সেস পেয়ে থাকেন তবে খুব ভাল বিকল্প
ফ্রান্সিসকো

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

4

ক্লাস্টারড ইনডেক্সেড ভিউতে একটি অনন্য সীমাবদ্ধতা তৈরি করা সম্ভব

আপনি এই মত ভিউ তৈরি করতে পারেন:

CREATE VIEW dbo.VIEW_OfYourTable WITH SCHEMABINDING AS
SELECT YourUniqueColumnWithNullValues FROM dbo.YourTable
WHERE YourUniqueColumnWithNullValues IS NOT NULL;

এবং এই মত অনন্য প্রতিবন্ধকতা:

CREATE UNIQUE CLUSTERED INDEX UIX_VIEW_OFYOURTABLE 
  ON dbo.VIEW_OfYourTable(YourUniqueColumnWithNullValues)

2

সম্ভবত একটি " INSTEAD OF" ট্রিগার বিবেচনা করুন এবং নিজেই পরীক্ষা করে দেখুন? চেহারা সক্ষম করতে কলামে একটি নন-ক্লাস্টারযুক্ত (অ-অনন্য) সূচক রয়েছে।


1

যেমন আগেই বলা হয়েছে, এসকিউএল সার্ভার এএনএসআই স্ট্যান্ডার্ডটি আসে যখন তা বাস্তবায়ন করে না UNIQUE CONSTRAINT২০০ since সাল থেকে এটির জন্য মাইক্রোসফ্ট সংযোগের জন্য একটি টিকিট রয়েছে there এখানে প্রস্তাবিত হিসাবে এবং এখানে আজকের সেরা বিকল্পগুলির মধ্যে একটি অন্য উত্তর বা গনিত কলামে বর্ণিত ফিল্টার সূচক ব্যবহার করা উচিত , যেমন:

CREATE TABLE [Orders] (
  [OrderId] INT IDENTITY(1,1) NOT NULL,
  [TrackingId] varchar(11) NULL,
  ...
  [ComputedUniqueTrackingId] AS (
      CASE WHEN [TrackingId] IS NULL
      THEN '#' + cast([OrderId] as varchar(12))
      ELSE [TrackingId_Unique] END
  ),
  CONSTRAINT [UQ_TrackingId] UNIQUE ([ComputedUniqueTrackingId])
)

1

আপনি যদি নির্দিষ্ট শর্ত এবং ত্রুটিগুলি পূরণ হয় তবে তা পরীক্ষা করার জন্য একটি ইনস্টল অফ ট্রিগার তৈরি করতে পারেন । বৃহত টেবিলগুলিতে একটি সূচক তৈরি করা ব্যয়বহুল হতে পারে।

এখানে একটি উদাহরণ:

CREATE TRIGGER PONY.trg_pony_unique_name ON PONY.tbl_pony
 INSTEAD OF INSERT, UPDATE
 AS
BEGIN
 IF EXISTS(
    SELECT TOP (1) 1 
    FROM inserted i
    GROUP BY i.pony_name
    HAVING COUNT(1) > 1     
    ) 
     OR EXISTS(
    SELECT TOP (1) 1 
    FROM PONY.tbl_pony t
    INNER JOIN inserted i
    ON i.pony_name = t.pony_name
    )
    THROW 911911, 'A pony must have a name as unique as s/he is. --PAS', 16;
 ELSE
    INSERT INTO PONY.tbl_pony (pony_name, stable_id, pet_human_id)
    SELECT pony_name, stable_id, pet_human_id
    FROM inserted
 END

-1

আপনি UNIQUEবাধা দিয়ে এটি করতে পারবেন না, তবে আপনি ট্রিগারে এটি করতে পারেন।

    CREATE TRIGGER [dbo].[OnInsertMyTableTrigger]
   ON  [dbo].[MyTable]
   INSTEAD OF INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    DECLARE @Column1 INT;
    DECLARE @Column2 INT; -- allow nulls on this column

    SELECT @Column1=Column1, @Column2=Column2 FROM inserted;

    -- Check if an existing record already exists, if not allow the insert.
    IF NOT EXISTS(SELECT * FROM dbo.MyTable WHERE Column1=@Column1 AND Column2=@Column2 @Column2 IS NOT NULL)
    BEGIN
        INSERT INTO dbo.MyTable (Column1, Column2)
            SELECT @Column2, @Column2;
    END
    ELSE
    BEGIN
        RAISERROR('The unique constraint applies on Column1 %d, AND Column2 %d, unless Column2 is NULL.', 16, 1, @Column1, @Column2);
        ROLLBACK TRANSACTION;   
    END

END

-1
CREATE UNIQUE NONCLUSTERED INDEX [UIX_COLUMN_NAME]
ON [dbo].[Employee]([Username] ASC) WHERE ([Username] IS NOT NULL) 
WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, SORT_IN_TEMPDB = OFF, 
DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF, ONLINE = OFF, 
MAXDOP = 0) ON [PRIMARY];

-1

এই কোডটি যদি আপনি টেক্সটবক্স দিয়ে একটি রেজিস্টার ফর্ম তৈরি করেন এবং সন্নিবেশ করান এবং আপনার পাঠ্যবক্সটি খালি থাকে এবং আপনি জমা বোতামে ক্লিক করেন।

CREATE UNIQUE NONCLUSTERED INDEX [IX_tableName_Column]
ON [dbo].[tableName]([columnName] ASC) WHERE [columnName] !=`''`;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.