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