চেক চেক কনট্রন্টের সাথে কী?


18

আমার কাছে কিছু অটো উত্পাদিত টি-এসকিউএল রয়েছে যা সম্ভবত বৈধ, তবে আমি সত্যিই বুঝতে পারি না।

ALTER TABLE [dbo].[MyTable]
WITH CHECK
CHECK CONSTRAINT [My_FORIEGN_KEY];

আমি জানি একটি বিদেশী কী বাধা কী, তবে কী CHECK CHECK?

উত্তর:


28

এমএসডিএন ডকুমেন্টেশন পৃষ্ঠায় ALTER TABLEএগুলি ব্যাখ্যা করে:

  • ALTER TABLE: টেবিলের কাঠামোটি সংশোধন করুন
    (এবং সম্ভাব্য কয়েকটি ক্রিয়া / পরিবর্তনগুলি হ'ল):
    • CHECK CONSTRAINT ..: সীমাবদ্ধতা সক্ষম করুন
    • NOCHECK CONSTRAINT ..: সীমাবদ্ধতা অক্ষম করুন সীমাবদ্ধতা
      তৈরি / সক্ষম / অক্ষম করার সময় করার জন্য অতিরিক্ত, alচ্ছিক পদক্ষেপগুলিও রয়েছে:
      • WITH CHECK: পাশাপাশি বাধাও পরীক্ষা করে দেখুন
      • WITH NOCHECK: সীমাবদ্ধতা পরীক্ষা করবেন না

তাদের কথায়:

| [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT   
    { ALL | constraint_name [ ,...n ] }

...

WITH CHECK | WITH NOCHECKসারণীতে থাকা ডেটা সদ্য যুক্ত হওয়া বা পুনরায় সক্ষম হওয়া FOREIGN KEYবা CHECKসীমাবদ্ধতার বিরুদ্ধে বৈধ নয় কিনা তা সুনির্দিষ্ট করে । নির্দিষ্ট না করা থাকলে WITH CHECKনতুন সীমাবদ্ধতার WITH NOCHECKজন্য ধরে নেওয়া হয় এবং পুনরায় সক্ষম সীমাবদ্ধতার জন্য ধরে নেওয়া হয়।

আপনি যদি বিদ্যমান ডেটার বিরুদ্ধে নতুন CHECKবা FOREIGN KEYপ্রতিবন্ধকতা যাচাই করতে না চান তবে ব্যবহার করুন WITH NOCHECK। বিরল ক্ষেত্রে বাদে আমরা এটি করার পরামর্শ দিই না। পরবর্তী সমস্ত আপডেটে নতুন প্রতিবন্ধকতা মূল্যায়ন করা হবে। সীমাবদ্ধতা যুক্ত WITH NOCHECKহওয়ার পরে দমন করা যে কোনও প্রতিবন্ধকতা লঙ্ঘনের ফলে ভবিষ্যতের আপডেটগুলি ব্যর্থ হতে পারে যদি তারা সীমাবদ্ধতা মেনে না এমন ডেটা দিয়ে সারিগুলি আপডেট করে।

ক্যোয়ারী অপ্টিমাইজার সংজ্ঞাগুলি সীমাবদ্ধতা বিবেচনা করে না WITH NOCHECKALTER TABLEসারণী ব্যবহার করে পুনরায় সক্ষম না করা পর্যন্ত এ জাতীয় বাধা উপেক্ষা করা হয় WITH CHECK CHECK CONSTRAINT ALL

...

{ CHECK | NOCHECK } CONSTRAINT
সীমাবদ্ধতার নাম সক্ষম বা অক্ষম করা হয়েছে তা সুনির্দিষ্ট করে। এই বিকল্পটি কেবলমাত্র সাথে ব্যবহার করা যাবে FOREIGN KEYএবং CHECKসীমাবদ্ধতার। যখন NOCHECKউল্লিখিত থাকলে, বাধ্যতা অক্ষম করা হয়েছে এবং ভবিষ্যতে টিপে বা কলাম আপডেট বাধ্যতা অবস্থার বিরুদ্ধে যাচাই করা হয় না। DEFAULT, PRIMARY KEYএবং UNIQUEসীমাবদ্ধতা অক্ষম করা যায় না।

টেস্ট dbfiddle :

CREATE TABLE a (aid INT PRIMARY KEY);

যাওয়া

INSERT INTO a (aid)
VALUES (1), (2), (3) ;

যাওয়া

3 টি সারি প্রভাবিত
CREATE TABLE b 
( aid INT,
  bid INT PRIMARY KEY,
  CONSTRAINT [My_FORIEGN_KEY]
    FOREIGN KEY (aid) REFERENCES a (aid)
) ;

যাওয়া

INSERT INTO b (aid, bid)
VALUES
  (1, 11),
  (1, 12),
  (2, 21), 
  (3, 31) ;

যাওয়া

4 টি সারি প্রভাবিত
INSERT INTO b (aid, bid)
VALUES
  (6, 61),
  (6, 62) ;

যাওয়া

এমএসজি 547 স্তর 16 রাজ্য 0 লাইন 1
INSERT বিবৃতিটি বিদেশী মূল সীমাবদ্ধতা "আমার_ফোরআইইগএন_কেই" এর সাথে বিরোধী। "Fiddle_792fce5de09f42908c3a0f91421f3522", টেবিল "dbo.a", কলাম 'সহায়তা' ডাটাবেসে এই দ্বন্দ্ব দেখা দিয়েছে।
এমএসজি 3621 স্তর 0 রাজ্য 0 লাইন 1
বিবৃতিতে বাতিল করা হয়েছে।
SELECT * FROM b ;

যাওয়া

সহায়তা | বিদার প্রস্তাব
-: | -:
  1 | 11
  1 | 12
  2 | 21
  3 | 31
ALTER TABLE b NOCHECK CONSTRAINT [My_FORIEGN_KEY];   --disable

যাওয়া

INSERT INTO b (aid, bid)
VALUES
  (4, 41),
  (4, 42) ;

যাওয়া

2 টি সারি প্রভাবিত
SELECT * FROM b ;

যাওয়া

সহায়তা | বিদার প্রস্তাব
-: | -:
  1 | 11
  1 | 12
  2 | 21
  3 | 31
  4 | 41
  4 | 42
ALTER TABLE b WITH NOCHECK CHECK CONSTRAINT [My_FORIEGN_KEY];  
-- enable constraint without checking existing data

যাওয়া

SELECT * FROM b ;

যাওয়া

সহায়তা | বিদার প্রস্তাব
-: | -:
  1 | 11
  1 | 12
  2 | 21
  3 | 31
  4 | 41
  4 | 42
INSERT INTO b (aid, bid)
VALUES
  (6, 61),
  (6, 62) ;

যাওয়া

এমএসজি 547 স্তর 16 রাজ্য 0 লাইন 1
INSERT বিবৃতিটি বিদেশী মূল সীমাবদ্ধতা "আমার_ফোরআইইগএন_কেই" এর সাথে বিরোধী। "Fiddle_792fce5de09f42908c3a0f91421f3522", টেবিল "dbo.a", কলাম 'সহায়তা' ডাটাবেসে এই দ্বন্দ্ব দেখা দিয়েছে।
এমএসজি 3621 স্তর 0 রাজ্য 0 লাইন 1
বিবৃতিতে বাতিল করা হয়েছে।
SELECT * FROM b ;

যাওয়া

সহায়তা | বিদার প্রস্তাব
-: | -:
  1 | 11
  1 | 12
  2 | 21
  3 | 31
  4 | 41
  4 | 42
ALTER TABLE b WITH CHECK CHECK CONSTRAINT [My_FORIEGN_KEY];  
-- check existing data and enable constraint 

যাওয়া

এমএসজি 547 স্তর 16 রাজ্য 0 লাইন 1
ALTER TABLE বিবৃতিটি বিদেশী মূল সীমাবদ্ধতা "আমার_ফোরআইইগএন_কেই" এর সাথে সাংঘর্ষিক। "Fiddle_792fce5de09f42908c3a0f91421f3522", টেবিল "dbo.a", কলাম 'সহায়তা' ডাটাবেসে এই দ্বন্দ্ব দেখা দিয়েছে।

1
ধন্যবাদ। Wrt ALTER TABLE b WITH NOCHECK CHECK CONSTRAINT [My_FORIEGN_KEY]; -- enable constraint without checking, এর অর্থ কি এই প্রতিবন্ধকতা বিদ্যমান ডেটাগুলি পরীক্ষা করবে না, কেবলমাত্র নতুন আগত ডেটা?
ব্যাংকসসান

1
যথাযথভাবে। কীভাবে পরবর্তী সন্নিবেশ (সহায়তা = 6) অনুমোদিত নয় তবে বিদ্যমান সারিগুলি (সহায়তা = 4 সহ) এখনও আছে।
ypercubeᵀᴹ

এটি নিখুঁতভাবে প্রদর্শন করে।
ব্যাংকসান

1

এখানে নিবন্ধটি পড়ার বিষয়টি বিবেচনা করুন: https://msdn.microsoft.com/en-us/library/ms190273.aspx

এটি আমাদের জানিয়েছে: 'ক্যোয়ারী অপ্টিমাইজারটি কোনও কিছুই ছাড়াই সংজ্ঞায়িত বাধাগুলি বিবেচনা করে না। এই ধরনের প্রতিবন্ধকতাগুলি অবধি অবধি অবধি উপেক্ষা করা হবে যতক্ষণ না তারা চেক চেক কনট্রাস্টেইনট'-এর সাথে ALL টেবিল টেবিল ব্যবহার করে পুনরায় সক্ষম করা হবে '

এছাড়াও, স্ট্যাক ওভারফ্লোতে থ্রেডটি বিবেচনা করুন: /programming/529941/with-check-add-constraint-followed-by-check-constraint-vs-add-constraint

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