Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

ओरेकल में विदेशी कुंजी का उपयोग कैसे करें

विदेशी कुंजी क्या है

Oracle में विदेशी कुंजी एकाधिक तालिकाओं को जोड़ने का एक तरीका है। यह तालिकाओं के बीच एक क्रॉस-लिंकिंग है।

  • विदेशी कुंजी एक स्तंभ या स्तंभ का सेट है जो प्राथमिक कुंजी या उसी तालिका या किसी अन्य तालिका में अद्वितीय कुंजी को संदर्भित करता है
  • विदेशी कुंजी मान डेटा मानों पर आधारित होते हैं और वे विशुद्ध रूप से तार्किक होते हैं न कि भौतिक संकेतकों पर
  • विदेशी कुंजी मान प्राथमिक कुंजी मान या अद्वितीय कुंजी मान से मेल खाना चाहिए या यह शून्य है।

विदेशी कुंजी बाधाओं को रेफरेंशियल अखंडता बाधाएं कहा जाता है। संदर्भित तालिका को मूल तालिका कहा जाता है जबकि विदेशी कुंजी वाली तालिका को चाइल्ड टेबल कहा जाता है।

विदेशी कुंजी का उपयोग कैसे करें

आइए EMP और DEPT के उदाहरण से देखें।

SQL>CREATE TABLE "DEPT"
 ( "DEPTNO" NUMBER(2,0),
 "DNAME" VARCHAR2(14),
 "LOC" VARCHAR2(13),
 CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO")
 )
 SQL>CREATE TABLE "EMP"
 ( "EMPNO" NUMBER(4,0),
 "ENAME" VARCHAR2(10),
 "JOB" VARCHAR2(9),
 "MGR" NUMBER(4,0),
 "HIREDATE" DATE,
 "SAL" NUMBER(7,2),
 "COMM" NUMBER(7,2),
 "DEPTNO" NUMBER(2,0),
 CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO")
 );
 SQL> desc emp
 Name Null? Type
 
 EMPNO NOT NULL NUMBER(4)
 ENAME VARCHAR2(10)
 JOB VARCHAR2(9)
 MGR NUMBER(4)
 HIREDATE DATE
 SAL NUMBER(7,2)
 COMM NUMBER(7,2)
 DEPTNO NUMBER(2)
 SQL>
 SQL> desc dept
 Name Null? Type
 
 DEPTNO NOT NULL NUMBER(2)
 DNAME VARCHAR2(14)
 LOC VARCHAR2(13)
 SQL>
 insert into DEPT values(10, 'ACCOUNTING', 'NEW YORK');
 insert into dept values(20, 'RESEARCH', 'DALLAS');
 insert into dept values(30, 'RESEARCH', 'DELHI');
 insert into dept values(40, 'RESEARCH', 'MUMBAI');
 insert into emp values( 7698, 'Blake', 'MANAGER', 7839, to_date('1-5-2007','dd-mm-yyyy'), 2850, null, 10 );
 insert into emp values( 7782, 'Clark', 'MANAGER', 7839, to_date('9-6-2008','dd-mm-yyyy'), 2450, null, 10 );
 insert into emp values( 7788, 'Scott', 'ANALYST', 7566, to_date('9-6-2012','dd-mm-yyyy'), 3000, null, 20 );
 insert into emp values( 7789, 'TPM', 'ANALYST', 7566, to_date('9-6-2017','dd-mm-yyyy'), 3000, null, null );
 insert into emp values( 7560, 'T1OM', 'ANALYST', 7567, to_date('9-7-2017','dd-mm-yyyy'), 4000, null, 20 );
 insert into emp values( 7790, 'TOM', 'ANALYST', 7567, to_date('9-7-2017','dd-mm-yyyy'), 4000, null, null );
 SQL> select  from emp;
 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
 
 7698 BLAKE MANAGER 7839 01-MAY-07 2850 10
 7782 CLARK MANAGER 7839 09-JUN-08 2450 10
 7788 SCOTT ANALYST 7566 09-JUN-12 3000 20
 7789 TPM ANALYST 7566 09-JUN-17 3000
 7790 TOM ANALYST 7567 09-JUL-17 4000
 7560 T1OM ANALYST 7567 09-JUL-17 4000 20

EMP तालिका में DEPT_NO कॉलम है। और DEPT तालिका में DEPT_NO कॉलम भी शामिल है और यह टेबल पर प्राथमिक कुंजी है।

अब हम तालिका ईएमपी में कोई प्रविष्टि नहीं चाहते हैं जहां DEPT_NO DEPT कॉलम में DEPT_NO के साथ मेल नहीं खाता है क्योंकि हमारे पास एक एम्प नहीं हो सकता है जिसका विभाग संख्या मौजूद नहीं है। आइए देखें कि क्या हम वर्तमान सेटअप के साथ ऐसा कर सकते हैं

SQL> insert into emp values( 7790, 'TOM', 'ANALYST', 7567, to_date('9-7-2017','dd-mm-yyyy'), 4000, null, 50);
 1 row created.

लेकिन यह सफल रहा और संरचना ने डेटा अखंडता की समस्या पैदा कर दी है

इस प्रकार की डेटा समस्याओं से बचने के लिए, हम ईएमपी तालिका पर विदेशी कुंजी बाधाओं को लागू कर सकते हैं।
आइए फिर से देखें

drop table emp;
 drop table dept;
 SQL>CREATE TABLE "DEPT"
 ( "DEPTNO" NUMBER(2,0),
 "DNAME" VARCHAR2(14),
 "LOC" VARCHAR2(13),
 CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO")
 )
 SQL>CREATE TABLE "EMP"
 ( "EMPNO" NUMBER(4,0),
 "ENAME" VARCHAR2(10),
 "JOB" VARCHAR2(9),
 "MGR" NUMBER(4,0),
 "HIREDATE" DATE,
 "SAL" NUMBER(7,2),
 "COMM" NUMBER(7,2),
 "DEPTNO" NUMBER(2,0),
 CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO"),
 CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO")
 REFERENCES "DEPT" ("DEPTNO") ENABLE
 );
 SQL> desc emp
 Name Null? Type
 
 EMPNO NOT NULL NUMBER(4)
 ENAME VARCHAR2(10)
 JOB VARCHAR2(9)
 MGR NUMBER(4)
 HIREDATE DATE
 SAL NUMBER(7,2)
 COMM NUMBER(7,2)
 DEPTNO NUMBER(2)
 SQL>
 SQL> desc dept
 Name Null? Type
 DEPTNO NOT NULL NUMBER(2)
 DNAME VARCHAR2(14)
 LOC VARCHAR2(13)
 SQL>
 insert into DEPT values(10, 'ACCOUNTING', 'NEW YORK');
 insert into dept values(20, 'RESEARCH', 'DALLAS');
 insert into dept values(30, 'RESEARCH', 'DELHI');
 insert into dept values(40, 'RESEARCH', 'MUMBAI');
 insert into emp values( 7698, 'Blake', 'MANAGER', 7839, to_date('1-5-2007','dd-mm-yyyy'), 2850, null, 10 );
 insert into emp values( 7782, 'Clark', 'MANAGER', 7839, to_date('9-6-2008','dd-mm-yyyy'), 2450, null, 10 );
 insert into emp values( 7788, 'Scott', 'ANALYST', 7566, to_date('9-6-2012','dd-mm-yyyy'), 3000, null, 20 );
 insert into emp values( 7789, 'TPM', 'ANALYST', 7566, to_date('9-6-2017','dd-mm-yyyy'), 3000, null, null );
 insert into emp values( 7560, 'T1OM', 'ANALYST', 7567, to_date('9-7-2017','dd-mm-yyyy'), 4000, null, 20 );
 insert into emp values( 7790, 'TOM', 'ANALYST', 7567, to_date('9-7-2017','dd-mm-yyyy'), 4000, null, null );

आइए अब उसी पंक्ति में प्रवेश करने का प्रयास करें

SQL> insert into emp values( 7790, 'TOM', 'ANALYST', 7567, to_date('9-7-2017','dd-mm-yyyy'), 4000, null, 50);
 insert into emp values( 7790, 'TOM', 'ANALYST', 7567, to_date('9-7-2017','dd-mm-yyyy'), 4000, null, 50)
 *
 ERROR at line 1:
 ORA-02291: integrity constraint (SCOTT.FK_DEPTNO) violated - parent key
 not found

इसलिए इसने खराब डेटा की प्रविष्टियों से बचा लिया है।

डीईपीटी तालिका से हटाएं के साथ भी यही परिदृश्य है। हमें उस विभाग की पंक्तियों को नहीं हटाना चाहिए जहाँ emp के कुछ रिकॉर्ड हैं। विदेशी कुंजी बाधाओं के बिना, ऐसा होगा और खराब डेटा का कारण होगा। लेकिन विदेशी कुंजी के साथ, इससे बचा जा सकेगा

SQL>  delete from dept where deptno=10;
  delete from dept where deptno=10
 *
 ERROR at line 1:
 ORA-02292: integrity constraint (SCOTT.FK_DEPTNO) violated - child record found

डिलीट ऑप्शन पर फॉरेन की क्लॉज

CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO")
 REFERENCES "DEPT" ("DEPTNO") ENABLE
 ON DELETE [CASCADE |SET NULL]

मामला 1: ON DELETE विकल्प के बिना परिभाषित विदेशी कुंजी
चाइल्ड टेबल में रिकॉर्ड पाए जाने पर आप पैरेंट टेबल से रिकॉर्ड नहीं हटा पाएंगे

मामला -2 ON DELETE SET NULL विकल्प के साथ परिभाषित विदेशी कुंजी
देखें कि यह कैसे काम करता है

SQL> alter table emp add CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO") REFERENCES "DEPT" ("DEPTNO") ON DELETE SET NULL;
 Table altered.
 SQL> select * from emp where empno=7698;
   EMPNO     DEPTNO
  -------  ----      
   7698      10
 SQL>  delete from dept where deptno=10;
 1 row deleted.
 SQL> commit;
 Commit complete.
 SQL> select * from emp where empno=7698;
   EMPNO     DEPTNO
  -------  ----      
   7698 

इसलिए पैरेंट टेबल से पंक्तियों को हटाने पर, चाइल्ड रो विदेशी कुंजी कॉलम को शून्य कर दिया जाता है

मामला -3 ON DELETE CASCADE विकल्प के साथ परिभाषित विदेशी कुंजी

SQL> alter table emp add CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO") REFERENCES "DEPT" ("DEPTNO") ON DELETE cascade;
 Table altered.
 SQL> delete from dept where deptno=10;
 1 row deleted.
 SQL> commit;
 Commit complete.
 SQL> select * from emp where  deptno=10; ;
 no rows selected
 SQL>

इसलिए पैरेंट टेबल से रो डिलीट करने पर चाइल्ड रो भी डिलीट हो जाते हैं

तालिका विदेशी कुंजी बदलें

टेबल बनाने के बाद भी हम Oracle में एक विदेशी कुंजी बना सकते हैं

 alter table emp add CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO") REFERENCES "DEPT" ("DEPTNO") ; 

विदेशी कुंजी बाधा कैसे छोड़ें

SQL> alter table emp drop constraint "FK_DEPTNO";
 Table altered.

बाधा को अक्षम कैसे करें

SQL> alter table emp  disable   constraint "FK_DEPTNO";
 Table altered.

बाधा को कैसे सक्षम करें

SQL>  alter table emp   enable  constraint "FK_DEPTNO";
 Table altered.
 SQL>

यह भी पढ़ता है
Oracle में बाधा की जाँच करें
Oracle में शून्य बाधा नहीं है
Oracle में प्राथमिक कुंजी कैसे जोड़ें :प्राथमिक कुंजी विशिष्ट रूप से तालिका में पंक्ति की पहचान करती है। ओरेकल में प्राथमिक कुंजी कैसे जोड़ें, प्राथमिक कुंजी कैसे छोड़ें, समग्र कुंजी कैसे बनाएं
विदेशी कुंजी बाधा को छोड़ें हम जल्दी से पंक्ति की पहचान करते हैं। यदि कोई अनुक्रमणिका उपलब्ध नहीं है तो Oracle कुंजी के लिए अद्वितीय अनुक्रमणिका बनाता है
ओरेकल में क्वेरी हटाएं
https://en.wikipedia.org/wiki/Foreign_key


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. R12/R12.2 . में Oracle प्रपत्र

  2. कनेक्शन खराब होने पर जेबॉस कनेक्शन पूल ओरेकल से फिर से कनेक्ट होने का कोई तरीका है?

  3. tnsnames.ora फ़ाइल के बिना Oracle कनेक्शन स्ट्रिंग

  4. Oracle 12c शीर्ष नई सुविधाएँ

  5. SQL डेवलपर में CSV…