इस तालिका को मानते हुए:
CREATE TABLE students
(
student_id SERIAL PRIMARY KEY,
player_name TEXT
);
विदेशी कुंजी को परिभाषित करने के चार अलग-अलग तरीके हैं (एक कॉलम पीके के साथ काम करते समय) और वे सभी एक ही विदेशी कुंजी बाधा की ओर ले जाते हैं:
-
लक्ष्य कॉलम का उल्लेख किए बिना इनलाइन:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students );
-
लक्ष्य कॉलम के उल्लेख के साथ इनलाइन:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students (student_id) );
-
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) );
-
एक अलग
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);
आप जो पसंद करते हैं वह स्वाद का मामला है। लेकिन आपको अपनी स्क्रिप्ट में निरंतरता रखनी चाहिए। अंतिम दो कथन एकमात्र विकल्प हैं यदि आपके पास एक PK को संदर्भित करने वाली विदेशी कुंजियाँ हैं जिसमें एक से अधिक स्तंभ हैं - आप उस मामले में FK "इनलाइन" को परिभाषित नहीं कर सकते हैं, उदा। foreign key (a,b) references foo (x,y)
केवल संस्करण 3 और 4) आपको एफके बाधा के लिए अपना खुद का नाम परिभाषित करने की क्षमता देगा यदि आप पोस्टग्रेज से सिस्टम द्वारा उत्पन्न लोगों को पसंद नहीं करते हैं।
serial
डेटा प्रकार वास्तव में डेटा प्रकार नहीं है। यह केवल एक संक्षिप्त हस्त संकेतन है जो अनुक्रम से लिए गए कॉलम के लिए एक डिफ़ॉल्ट मान को परिभाषित करता है। तो कोई भी कॉलम संदर्भित serial
. के रूप में परिभाषित एक स्तंभ उपयुक्त आधार प्रकार integer
. का उपयोग करके परिभाषित किया जाना चाहिए (या bigint
bigserial
के लिए कॉलम)