Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Cara menggunakan kunci asing di oracle

Apa itu kunci Asing

Kunci asing di Oracle adalah cara untuk menghubungkan beberapa Tabel. Ini adalah tautan silang antar tabel.

  • Kunci asing adalah kolom atau kumpulan kolom yang mengacu pada kunci utama atau kunci Unik pada tabel yang sama atau tabel lain
  • Nilai kunci asing didasarkan pada nilai data dan merupakan konstruksi logika murni bukan penunjuk fisik
  • Nilai kunci asing harus cocok dengan nilai kunci utama atau nilai kunci unik atau nol.

Batasan kunci asing disebut batasan integritas referensial. Tabel yang direferensikan disebut tabel induk sedangkan tabel dengan kunci asing disebut tabel anak.

cara menggunakan kunci asing

Mari kita periksa dengan contoh EMP dan 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

Tabel EMP berisi kolom DEPT_NO. dan Tabel DEPT juga berisi kolom DEPT_NO dan merupakan kunci utama pada tabel.

Sekarang kami tidak ingin entri apa pun di tabel EMP di mana DEPT_NO tidak cocok dengan DEPT_NO di kolom DEPT karena kami tidak dapat memiliki emp yang Nomor deptnya tidak ada. Mari kita lihat apakah kita bisa melakukannya dengan Setup saat ini

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

Tapi ini berhasil dan strukturnya menyebabkan masalah integritas data

Untuk menghindari jenis masalah data ini, kita dapat menerapkan batasan kunci Asing pada tabel EMP.
Mari kita lihat lagi

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 );

Sekarang mari kita coba masuk ke baris yang sama

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

Jadi telah menghindari entri data yang buruk.

Hal yang sama adalah skenario dengan Hapus dari tabel DEPT. Kita tidak boleh menghapus baris dept di mana emp memiliki beberapa catatan. Tanpa batasan kunci asing, itu akan terjadi dan akan menyebabkan data buruk. Tetapi dengan kunci Asing, ini akan dihindari

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

Klausul Kunci Asing pada Opsi Hapus

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

Kasus 1: Kunci asing ditentukan tanpa opsi ON DELETE
Anda tidak akan dapat menghapus record dari tabel induk jika record ditemukan di tabel anak

Kasus -2 Kunci asing ditentukan dengan opsi ON DELETE SET NULL
Mari kita lihat cara kerjanya

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 

Jadi saat menghapus baris dari tabel induk, baris anak kolom kunci asing dibuat null

Kasus -3 Kunci asing ditentukan dengan opsi 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>

Jadi saat menghapus baris dari tabel induk, baris anak juga dihapus

Ubah Kunci Asing Tabel

Kita dapat membuat kunci Asing di Oracle setelah pembuatan Tabel juga

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

Cara menghilangkan Batasan kunci Asing

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

Cara menonaktifkan batasan

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

Cara mengaktifkan batasan

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

Juga Dibaca
Periksa batasan di Oracle
Bukan batasan Null di Oracle
Cara Menambahkan kunci utama di Oracle :kunci utama secara unik mengidentifikasi baris dalam tabel. Cara Menambahkan kunci utama di oracle, cara melepaskan kunci utama, cara membuat kunci komposit
melepaskan batasan kunci asing oracle
kunci unik di oracle :Kunci unik memberlakukan unik di kolom dalam tabel dan membantu kami mengidentifikasi baris dengan cepat. Oracle membuat indeks unik untuk kunci jika tidak ada indeks yang tersedia
hapus kueri di 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. Oracle - Mengapa saya harus menggunakan paket daripada prosedur atau fungsi yang berdiri sendiri?

  2. Bagaimana cara mengarahkan output DBMS_OUTPUT.PUT_LINE ke file?

  3. Cara mengulangi rentang tanggal di PL/SQL

  4. Jalankan Oracle Forms sebagai standalone tanpa browser

  5. Cara mengirim permintaan POST dengan data formulir dan parameter di PL/SQL