postgresql বিদেশী কী সিনট্যাক্স


122

আমার 2 টি টেবিল রয়েছে যেহেতু আপনি নীচের আমার পোগ্রগ্রিকেল কোডটিতে দেখতে পাবেন। প্রথম টেবিলের শিক্ষার্থীদের ২ টি কলাম রয়েছে, একটি ছাত্র_নামের জন্য এবং অন্য ছাত্র_আইড যা প্রাথমিক কী। টেস্ট নামক আমার দ্বিতীয় সারণীতে, এটিতে 4 টি কলাম রয়েছে, সাবজেক্ট_আইডের জন্য একটি, সাবজেক্ট_নামের জন্য একটি, তারপরে একটি শিক্ষার্থীর জন্য একটি সাবজেক্ট হাইজস্ট স্কোরযুক্ত যা সর্বোচ্চ স্টুডেন্ট_আইডি। আমি সর্বোচ্চ স্টুডেন্ট_আইডি করার চেষ্টা করছি আমার ছাত্রদের টেবিলে স্টুডেন্ট_আইডিকে উল্লেখ করুন। এটি নীচের কোডটি আমার নীচে রয়েছে, সিনট্যাক্সটি সঠিক কিনা তা নিশ্চিত নন:

CREATE TABLE students ( student_id SERIAL PRIMARY KEY,
                 player_name TEXT);

CREATE TABLE tests ( subject_id SERIAL,
                   subject_name,
                   highestStudent_id SERIAL REFERENCES students);

সিনট্যাক্স highestStudent_id SERIAL REFERENCES studentsসঠিক? কারণ আমি অন্য একটি পছন্দ করেছিhighestStudent_id REFERENCES students(student_id))

দয়া করে পোস্টগ্রেস্কলিতে বিদেশী কী তৈরির সঠিক উপায়টি কী হবে?


4
হ্যাঁ সিনট্যাক্সটি "সঠিক"। তবে এফকে কলামটি যেমন নির্ধারণ করা উচিত তত সংজ্ঞা দেওয়া উচিত নয় । কোনও "আসল" ডেটা টাইপ নয়, এটি ক্রম থেকে পূর্বনির্ধারিত মানটি serialintegerserial
জনপ্রিয়

যদি এফকে একটি প্রাথমিক কী উল্লেখ করে তবে কোনও কলামের প্রয়োজন নেই। যদি এফকে কোনও বিকল্প কী উল্লেখ করে, কলামগুলি প্রয়োজন।
jarlh

1
আপনার বিদেশী কী সারণি "প্লেয়ারগুলি" উল্লেখ করে। আপনি জন্য প্রদর্শিত হয় না আছে "খেলোয়াড়দের" নামের একটি টেবিল।
মাইক শেরিল 'ক্যাট রিক্যাল'

@ মাইক শেরিল 'বিড়ালের স্মরণ করুন দুঃখিত, আমার ভুলের অর্থ আমি সর্বোচ্চ স্টুডেন্ট_আইডি পূর্ণসংখ্যার শিক্ষার্থীদের রেফারেন্স করেছি
হামজা

উত্তর:


249

এই টেবিলটি ধরে নেওয়া:

CREATE TABLE students 
( 
  student_id SERIAL PRIMARY KEY,
  player_name TEXT
);

একটি বিদেশী কী সংজ্ঞায়িত করার জন্য আলাদা আলাদা চারটি উপায় রয়েছে (যখন একটি একক কলাম পিকে নিয়ে কাজ করা হয়) এবং সেগুলি একই বিদেশী কী সীমাবদ্ধতার দিকে পরিচালিত করে:

  1. লক্ষ্য কলাম উল্লেখ না করে ইনলাইন:

    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students
    );
  2. লক্ষ্য কলাম উল্লেখ করার সাথে ইনলাইন:

    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students (student_id)
    );
  3. ভিতরে লাইন বাইরে create table:

    CREATE TABLE tests 
    ( 
      subject_id SERIAL,
      subject_name text,
      highestStudent_id integer, 
      constraint fk_tests_students
         foreign key (highestStudent_id) 
         REFERENCES students (student_id)
    );
  4. পৃথক alter tableবিবৃতি হিসাবে :

    CREATE TABLE tests 
    ( 
      subject_id SERIAL,
      subject_name text,
      highestStudent_id integer
    );
    
    alter table tests 
        add constraint fk_tests_students
        foreign key (highestStudent_id) 
        REFERENCES students (student_id);

আপনি কোনটি পছন্দ করেন তা স্বাদের বিষয়। তবে আপনার স্ক্রিপ্টগুলিতে সামঞ্জস্য থাকা উচিত। শেষ দুটি বিবৃতি একমাত্র বিকল্প যদি আপনার কাছে একাধিক কলামযুক্ত একটি পিকে রেফারেন্স করার জন্য বিদেশী কী থাকে - আপনি এ ক্ষেত্রে এফকে "ইনলাইন" সংজ্ঞায়িত করতে পারবেন না, যেমনforeign key (a,b) references foo (x,y)

কেবল সংস্করণ 3) এবং 4) আপনি পোস্টগ্রিস থেকে সিস্টেম তৈরির পছন্দগুলি পছন্দ না করলে এফকে সীমাবদ্ধতার জন্য আপনার নিজের নামটি সংজ্ঞা দেওয়ার ক্ষমতা দেবে।


serialডাটা টাইপ সত্যিই একটি ডাটা টাইপ নয়। এটি কেবল একটি সংক্ষিপ্ত হাত সংকেত যা ক্রম থেকে নেওয়া কলামের জন্য একটি ডিফল্ট মান নির্ধারণ করে। সুতরাং কোনো কলাম উল্লেখ একটি কলাম হিসাবে সংজ্ঞায়িত করা serialযথাযত বেস ধরনের ব্যবহার নির্ধারণ করা আবশ্যক integer(অথবা bigintজন্য bigserialকলাম)


এই লিঙ্কটি ( postgresqltutorial.com/postgresql-foreign-key ) আপনি যা বলেছিলেন তা করার একটি অন্য উপায় দেখায় কেবল 3 এবং 4-তে কেবল 'সীমাবদ্ধতা' কমান্ড দিয়ে করা যেতে পারে? এছাড়াও, এফকে-র আগে বিদেশী কী রাখার কী আছে? দেখে মনে হচ্ছে আমরা যখন এটি করি তখন আমাদের চলক প্রকারটি ঘোষণা করতে হবে না?
কথার আড়ালে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.