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