আমি একটি লক্ষ্য করেছি MATCH SIMPLE
এবং MATCH FULL
তারা কী করে তা আমি বুঝতে পারি না। আমি ডিফল্ট হয় দেখতে MATCH SIMPLE
; কিন্তু, অন্যান্য MATCH
ধারাগুলি কীভাবে FOREIGN KEY
সীমাবদ্ধতার কাজ করবে?
আমি একটি লক্ষ্য করেছি MATCH SIMPLE
এবং MATCH FULL
তারা কী করে তা আমি বুঝতে পারি না। আমি ডিফল্ট হয় দেখতে MATCH SIMPLE
; কিন্তু, অন্যান্য MATCH
ধারাগুলি কীভাবে FOREIGN KEY
সীমাবদ্ধতার কাজ করবে?
উত্তর:
CREATE TABLE
ম্যানুয়ালটির পৃষ্ঠাটি দেখুন :
তিনটি ম্যাচ ধরনের হয়:
MATCH FULL
,MATCH PARTIAL
, এবংMATCH SIMPLE
(যা ডিফল্ট)।MATCH FULL
সমস্ত বিদেশী কী কলামগুলি বাতিল না হলে মাল্টিকালম বিদেশী কী এর একটি কলাম বাতিল হতে দেয় না; যদি সেগুলি সমস্ত নাল হয় তবে রেফারেন্স সারণিতে সারিটির কোনও মিল থাকার দরকার নেই।MATCH SIMPLE
বিদেশী কী কলামগুলির যে কোনওটি শূন্য হতে দেয়; যদি তাদের মধ্যে কোনওটি শূন্য হয়, তবে সারিটির রেফারেন্স সারণীতে কোনও মিল থাকতে হবে না।MATCH PARTIAL
এখনও প্রয়োগ করা হয়নি। (অবশ্যই,NOT NULL
এই কেসগুলি উত্থাপন থেকে রোধ করতে রেফারেন্সিং কলামে গুলি সীমাবদ্ধতা প্রয়োগ করা যেতে পারে))
এছাড়াও, বিদেশী কীগুলির অধ্যায়ে :
সাধারণত, কোনও রেফারেন্সিং সারি বিদেশী কী সীমাবদ্ধতা পূরণ করতে হবে না যদি এর কোনও রেফারেন্সিং কলাম শূন্য থাকে। যদি
MATCH FULL
বিদেশী কী ঘোষণার সাথে যুক্ত করা হয় তবে কেবলমাত্র তার সমস্ত রেফারেন্সিং কলামগুলি শূন্য হলেই একটি রেফারেন্সিং সারিটি সীমাবদ্ধতা পূরণ করে পালিয়ে যায় (সুতরাং নাল এবং নন-নাল মানগুলির সংমিশ্রণ একটিMATCH FULL
সীমাবদ্ধতা ব্যর্থ হওয়ার গ্যারান্টিযুক্ত )। আপনি যদি না চান তবে রেফারেন্সিং সারিগুলি বিদেশী কী সীমাবদ্ধতা সন্তুষ্ট করতে এড়াতে সক্ষম হবে, রেফারেন্সিং কলাম (গুলি) হিসাবে হিসাবে ঘোষণা করুনNOT NULL
।
এবং বর্তমান ম্যানুয়াল বা আপনার ইনস্টলেশনের সাথে মিলে যাওয়া সংস্করণটির সাথে অবশ্যই পরামর্শ করুন । পুরানো সংস্করণগুলিতে পুরানো Google লিঙ্কগুলিতে পড়বেন না।
FULL
বনাম SIMPLE
বনামPARTIAL
নির্বাচিত উত্তরটি সঠিক হলেও, যদি এটি আপনার কাছে নতুন হয় তবে আপনি কোড সহ এটি দেখতে চাইতে পারেন - আমার মনে হয় এইভাবে আঁকানো আরও সহজ।
-- one row with (1,1)
CREATE TABLE foo ( a int, b int,
PRIMARY KEY (a,b)
);
INSERT INTO foo (a,b) VALUES (1,1);
--
-- two child tables to reference it
--
CREATE TABLE t_full ( a int, b int,
FOREIGN KEY (a,b) REFERENCES foo MATCH FULL
);
CREATE TABLE t_simple ( a int, b int,
FOREIGN KEY (a,b) REFERENCES foo MATCH SIMPLE
);
যৌক্তিকভাবে FULL
এবং এর সাথে SIMPLE
, আমরা একটি সম্পূর্ণ ম্যাচ inোকাতে পারি।
-- works
INSERT INTO t_full (a,b) VALUES (1,1);
INSERT INTO t_simple (a,b) VALUES (1,1);
সমস্যাটি আসে যখন একটি কলাম হয় NULL
।
-- works
INSERT INTO t_simple (a,b) VALUES (1,NULL);
-- fails
INSERT INTO t_full (a,b) VALUES (1,NULL);
Into t_full
োকানো নিম্নলিখিত ত্রুটি উত্পন্ন করে,
ERROR: insert or update on table "t_full" violates foreign key constraint "t_full_a_fkey"
DETAIL: MATCH FULL does not allow mixing of null and nonnull key values.
INSERT 0 1
ঠিক আছে, তবে কি সম্পর্কে (42,NULL)
- এটি এমনই অংশ যা আমি সবসময় বিভ্রান্তি পেয়েছিলাম MATCH SIMPLE
,
-- works
INSERT INTO t_simple (a,b) VALUES (42,NULL);
উপরের আচরণটি প্রয়োগহীনদের সাথে কাজ করবে নাMATCH PARTIAL
, যা সম্ভবত আপনি একটি যৌগিক সূচকের জন্য যা করতে চান যেখানে ডান-সর্বাধিক কলামটি NULL
সম্পাদিত হয় does তবে কিছু লোক দেখেন যে প্যান্ডোরার বাক্সটি খারাপ ডিজাইনে খোলার পদ্ধতি হিসাবে।
MATCH FULL
সমস্ত কিছু অবশ্যই পুরোপুরি মিলবে, বা সমস্ত কলাম অবশ্যই হওয়া উচিতNULL
MATCH SIMPLE
যদি একটি বিষয় NULL
সীমাবদ্ধ থাকে তবে কেবল তা উপেক্ষা করা হবে।MATCH PARTIAL
যদি এক জিনিস NULL
সত্য যে সবকিছু NULL
হয় আংশিকভাবে কিছু বাধ্যতা উদ্দেশ্যে যুক্তিসম্মত করে উদ্ধার।উত্তরোত্তর জন্য, এখানে এসকিউএল স্পেক থেকে সংজ্ঞা দেওয়া আছে <match type>
MATCH SIMPLE
যদি কমপক্ষে একটি রেফারেন্সিং কলামটি শূন্য হয়, তবে রেফারেন্সিং সারণির সারিটি সীমাবদ্ধতা পরীক্ষা করে। যদি সমস্ত রেফারেন্সিং কলামগুলি নাল না থাকে, তবে সারিটি সীমাবদ্ধতা যাচাই করে এবং কেবলমাত্র যদি রেফারেন্সিং সারণীর সারি থাকে যা সমস্ত রেফারেন্সিং কলামগুলির সাথে মেলে।MATCH PARTIAL
: যদি সমস্ত রেফারেন্সিং কলামগুলি শূন্য হয়, তবে রেফারেন্সিং সারণির সারিটি সীমাবদ্ধতা পরীক্ষা করে। যদি কমপক্ষে একটি রেফারেন্সিং কলামগুলি শূন্য না হয়, তবে সারিটি সীমাবদ্ধ চেকটি পাস করে যদি এবং কেবলমাত্র রেফারেন্স টেবিলের সারি থাকে যা সমস্ত নন-রেফারেন্সিং কলামগুলির সাথে মেলে।MATCH FULL
: যদি সমস্ত রেফারেন্সিং কলামগুলি শূন্য হয়, তবে রেফারেন্সিং সারণির সারিটি সীমাবদ্ধতা পরীক্ষা করে। যদি সমস্ত রেফারেন্সিং কলামগুলি নাল না থাকে, তবে সারিটি সীমাবদ্ধতা যাচাই করে এবং কেবলমাত্র যদি রেফারেন্সিং সারণীর সারি থাকে যা সমস্ত রেফারেন্সিং কলামগুলির সাথে মেলে। কিছু রেফারেন্সিং কলাম যদি নাল হয় এবং অন্য রেফারেন্সিং কলামটি শূন্য হয় তবে রেফারেন্সিং সারণির সারিটি সীমাবদ্ধতা চেকটিকে লঙ্ঘন করে।
এটি পোস্টগ্র্রেএসকিউএল নির্দিষ্ট না হলেও এই উদাহরণগুলি পোস্টগ্রেএসকিউএল দিয়ে প্রদর্শিত হয়