এসকিউএল সার্ভারে একটি ভিউতে আমি কী একটি কলাম কলামে বিদেশী কী পেতে পারি?


85

এসকিউএল সার্ভারে 2008 এবং প্রদত্ত

TableA(A_ID, A_Data)
TableB(B_ID, B_Data)
ViewC(A_or_B_ID, A_or_B_Data)

এই TableZ(A_or_B_ID, Z_Data)জাতীয় Z.A_or_B_IDকলামটি কি পাওয়া মানগুলির মধ্যে সীমাবদ্ধ তা নির্ধারণ করা সম্ভব ViewC? বিদেশী কী দিয়ে এই কাজটি করা যায়?

উত্তর:


110

আপনি কোনও বিদেশী কীতে কোনও ভিউ উল্লেখ করতে পারবেন না।


38
এটি কি এসকিউএল সার্ভারের সীমাবদ্ধতা বা এটি চাওয়াটি অযৌক্তিক জিনিস?
অ্যারোন আনোডাইড

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

4
এটি এই ফলোআপ প্রশ্নগুলির একটি ভাল উত্তর - stackoverflow.com/questions/3833150/…
ক্রিস হালক্রো

আমি নিশ্চিত না যে কীভাবে এই প্রশ্নগুলির একটি উত্তরের জবাব দেওয়া যায় ... এটি একটি ভিন্ন ডিবিএমএস সম্পর্কে এবং বলে যে স্কিমার বিবরণ এবং ব্যবহারকারীর সুবিধাগুলি গোপন করার জন্য মতামতগুলি তৈরি করা হয়েছিল। প্রথমত, ঠিক আছে ... তবে প্রাথমিক নকশার বাইরে কঠিন ব্যবহারের সন্ধান পাওয়া এটি প্রথম জিনিস নয়। দ্বিতীয়ত, কোনও এফকে কেন এটি করবে না তা আমি নিশ্চিত নই। একটি ভিউ যে কোনও প্রশ্ন হতে পারে এমনকি এটি কোনও টেবিলের বাইরেও আঁকতে হবে না, এটি একত্রে একত্রিত হওয়া ধ্রুবকের একগুচ্ছ হতে পারে ... এক্ষেত্রে একটি বিদেশী কী বেশ সুন্দরী বলে মনে হয়। যদি এর কারণ থাকে তবে আমি আরও গভীর কিছু আশা করি না।
জর্জ মাউয়ার

27

পুরানো এসকিউএল সার্ভার সংস্করণে বিদেশী কীগুলি কেবল ট্রিগারগুলির মাধ্যমেই সম্ভব ছিল। আপনি একটি সন্নিবেশ ট্রিগার তৈরি করে একটি কাস্টম বিদেশী কী নকল করতে পারেন যা সন্নিবেশিত মানটি কোনও প্রাসঙ্গিক সারণীতেও প্রদর্শিত হয় কিনা তা যাচাই করে।


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

16

আপনার যদি A_or_B_IDটেবিলজেডে সত্যই প্রয়োজন হয়, আপনার দুটি অনুরূপ বিকল্প রয়েছে:

1) nullable যোগ করুন A_IDএবং B_IDটেবিল z এর কলাম, করতে A_or_B_IDএই দুটি স্তম্ভের উপর ISNULL ব্যবহার করে একটি নির্ণিত কলাম, এবং একটি চেক বাধ্যতা যোগ যেমন যে মাত্র এক A_IDবা B_IDনাল নয়

২) টেবিল জেডে একটি টেবিলনাম কলাম যুক্ত করুন, এখন এ বা বি হয় তা অন্তর্ভুক্ত করুন A_IDএবং B_IDগণনাকৃত কলামগুলি তৈরি করুন , যখন কেবলমাত্র তাদের উপযুক্ত সারণির নাম দেওয়া হবে (CASE এক্সপ্রেশন ব্যবহার করে) non তাদেরও অবিচল করুন

উভয় ক্ষেত্রেই এখন আপনার কাছে A_IDএবং B_IDকলামগুলিতে বেস টেবিলগুলির জন্য উপযুক্ত বিদেশী কী থাকতে পারে। পার্থক্যটি এটিতে কলামগুলি গণনা করা হয়। এছাড়াও 2 আইডি কলামের ডোমেনগুলি যদি ওভারল্যাপ না করে তবে উপরের বিকল্প 2 তে আপনার টেবিলনামের প্রয়োজন নেই - যতক্ষণ আপনার কেস এক্সপ্রেশনটি নির্ধারণ করতে পারে যে কোন ডোমেনে A_or_B_ID পড়েছে

(আমার ফর্ম্যাটিং ঠিক করার জন্য মন্তব্য করার জন্য ধন্যবাদ)


ব্যাক- A_or_B_ID
টিকগুলিতে

আমি কোনও উত্তরাধিকার ব্যবস্থায় কিছু বৈশিষ্ট্য যুক্ত করার বিষয়ে কাজ করছি এবং পুরানো এবং নতুন একসাথে প্যাচ করার এটি দুর্দান্ত উপায়। ধন্যবাদ!
ডেভিড গাউনসন


4

আরও একটি বিকল্প আছে। টেবিলএ এবং টেবিলবি কে টেবিলপ্রাইম নামে একটি নতুন সারণীর সাবক্লাস হিসাবে বিবেচনা করুন। টেবিলবির আইডি মানগুলি সামঞ্জস্য করুন যাতে তারা টেবিলএর আইডি মানগুলির সাথে মেলে না। টেবিলপ্রাইমে আইডি তৈরি করুন পিকে এবং টেবিলপ্রাইমে টেবিলএ এবং টেবিলবি'র (সমন্বিত) সমস্ত আইডি .োকান। টেবিলপ্রিমের একই আইডিতে টেবিলএ এবং টেবিলবি'র সাথে তাদের পিকে FK সম্পর্ক রয়েছে Make

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

আপনার আরও বিশদ প্রয়োজন হলে জিজ্ঞাসা করুন। বিভিন্নতা রয়েছে যা আপনাকে A এবং B পারস্পরিক একচেটিয়া তা নিশ্চিত করতে দেয় বা আপনি যে জিনিসটির সাথে কাজ করছেন তা একই সাথে উভয়ই হতে পারে। সম্ভব হলে এফকেগুলিতে এটি আনুষ্ঠানিক করা ভাল।


2

একটি সীমাবদ্ধতা যুক্ত করা সহজ যা কোনও ব্যবহারকারী সংজ্ঞায়িত ফাংশনকে উল্লেখ করে যা আপনার জন্য চেক তৈরি করে, fCheckIfValueExists (কলামওয়ালু) যা মান উপস্থিত থাকলে এবং মিথ্যা না থাকলে সত্যটি প্রত্যাবর্তন করে।

বিপরীত দিকটি হ'ল এটি একাধিক কলাম গ্রহণ করতে পারে, তাদের সাথে গণনা সম্পাদন করতে পারে, নাল গ্রহণ করতে পারে এবং এমন মানগুলি গ্রহণ করতে পারে যা প্রাথমিক কী এর সাথে যথাযথভাবে সামঞ্জস্য করে না বা যোগদানের ফলাফলের সাথে তুলনা করে।

ডাউনসাইডটি হ'ল অপটিমাইজার তার সমস্ত বিদেশী কী কৌশল ব্যবহার করতে পারে না।


4
ডাউনসাইডটি হ'ল অপ্টিমাইজারটি তার সমস্ত বিদেশী কী কৌশল ব্যবহার করতে পারে না ... ... এবং আপনি যে সারিটি সন্নিবেশ করান / আপডেট করেন তা প্রতিটি ফাংশনটি চালিত হবে (সেটগুলির জন্য খুব সুন্দর নয়)।
jimbobmcgee

1

দুঃখিত, শব্দটির কঠোর অর্থে, আপনি কোনও ভিউতে বিদেশী কী সেট করতে পারবেন না। এখানে কেন:

আইএনএনডিবি হ'ল মাইএসকিউএলের একমাত্র বিল্ট-ইন স্টোরেজ ইঞ্জিন যা বিদেশী কীগুলি বৈশিষ্ট্যযুক্ত। যে কোনও InnoDB টেবিলটি ইঞ্জিন = 'InnoDB' দিয়ে তথ্য_স্কেমা টেবিলগুলিতে নিবন্ধিত হবে।

ইনফরমেশন_সেমিটা টেবিলগুলিতে নিবন্ধভুক্ত হওয়ার সময় দেখা হয়েছে, এতে একটি NUL স্টোরেজ ইঞ্জিন রয়েছে। মাইএসকিউএলে কোনও টেবিলে বিদেশী কী আছে এমন কোনও ব্যবস্থা নেই যার একটি অপরিজ্ঞাত স্টোরেজ ইঞ্জিন রয়েছে।

ধন্যবাদ!


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