Anda di halaman 1dari 34

Database Programming with

SQL
14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan CHECK

Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang.
Tujuan
• Pelajaran ini akan membahas tujuan berikut:
−Menentukan dan memberi contoh constraint PRIMARY KEY,
FOREIGN KEY, dan CHECK
−Menjelaskan tujuan menentukan constraint PRIMARY KEY,
FOREIGN KEY, dan CHECK
−Menunjukkan pembuatan constraint pada level kolom dan
level tabel dalam pernyataan CREATE TABLE
−Mengevaluasi masalah bisnis yang mengharuskan
penambahan constraint PRIMARY KEY
dan FOREIGN KEY serta menuliskan
kode menjalankan perubahan

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 3
CHECK
Tujuan
• Seperti dibahas di bagian sebelumnya, constraint
digunakan untuk mencegah entri data yang tidak valid
ke dalam tabel database
• Apa yang akan terjadi jika, secara diam-diam atau
hanya karena kesalahan yang ceroboh, identifikasi unik
pribadi Anda diberikan kepada orang lain?
• Bagaimana jika besok di sekolah, seseorang dikreditkan
dengan kelas Anda untuk kelulusan atau bisa makan
siang menggunakan nomor kartu makan siang Anda?
• Memastikan integritas data adalah tentang constraint.
Bagaimanapun, Anda unik!

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 4
CHECK
Constraint PRIMARY KEY
• Constraint PRIMARY KEY adalah aturan bahwa nilai-
nilai dalam satu kolom atau kombinasi kolom harus
secara unik mengidentifikasi setiap baris dalam tabel
• Tidak ada nilai primary key yang dapat muncul di lebih
dari satu baris dalam tabel
• Untuk memenuhi constraint PRIMARY KEY, kedua
ketentuan berikut ini harus benar:
−Tidak ada kolom yang merupakan bagian dari primary key
yang dapat berisi nol
−Tabel hanya dapat memiliki satu primary key

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 5
CHECK
Constraint PRIMARY KEY
• Constraint PRIMARY KEY dapat didefinisikan pada
kolom atau tingkat tabel
• Namun, jika PRIMARY KEY komposit dibuat, itu harus
didefinisikan pada tingkat tabel
• Saat mendefinisikan kolom PRIMARY KEY, itu adalah
praktik yang baik untuk menggunakan akhiran _pk
dalam nama constraint
• Misalnya, nama constraint untuk kolom PRIMARY KEY
yang bernama client_number dalam tabel bernama
CLIENTS bisa berupa clients_client_num_pk

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 6
CHECK
Constraint PRIMARY KEY
• Dalam pernyataan CREATE TABLE, sintaks constraint
PRIMARY KEY kolom dinyatakan:
CREATE TABLE clients
(client_number NUMBER(4) CONSTRAINT clients_client_num_pk
PRIMARY KEY,
first_name VARCHAR2(14),
last_name VARCHAR2(13));

• Perhatikan bahwa level kolom hanya merujuk ke area


dalam pernyataan CREATE TABLE di mana kolom
didefinisikan
• Level tabel mengacu pada baris terakhir dalam
pernyataan di bawah daftar nama kolom individu

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 7
CHECK
Constraint PRIMARY KEY
• Untuk membuat constraint PRIMARY KEY di level-tabel
sintaksnya adalah:
CREATE TABLE clients
(client_number NUMBER(4),
first_name VARCHAR2(14),
last_name VARCHAR2(13),
CONSTRAINT clients_client_num_pk PRIMARY KEY
(client_number));

• Perhatikan bahwa nama kolom PRIMARY KEY


mengikuti tipe constraint, dan dilampirkan dalam
tanda kurung

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 8
CHECK
Constraint PRIMARY KEY
• Untuk mendefinisikan PRIMARY KEY komposit, Anda
harus mendefinisikan constraint di tingkat tabel
daripada tingkat kolom
• Contoh constraint primary key komposit ditunjukkan di
bawah ini:
CREATE TABLE copy_job_history
(employee_id NUMBER(6,0),
start_date DATE,
job_id VARCHAR2(10),
department_id NUMBER(4,0),
CONSTRAINT copy_jhist_id_st_date_pk PRIMARY KEY(employee_id,
start_date));

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 9
CHECK
PRIMARY KEY (INTEGRITAS REFERENSI)
Constraint
• Constraint FOREIGN KEY juga disebut constraint
"integritas referensial"
• Constraint Foreign Key menunjukkan kolom atau
kombinasi kolom sebagai foreign key
• Foreign Key menautkan kembali ke primary key (atau
unique key) di tabel lain, dan tautan ini adalah dasar
dari hubungan antar tabel

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 10
CHECK
Melihat Foreign Key
• Tabel yang berisi foreign key disebut tabel "anak" dan
tabel yang berisi kunci referensi disebut tabel "induk"
DEPARTMENTS - Induk
DEPARTMENT_ID DEPT_NAME MANAGER_ID LOCATION_ID
90 Executive 100 1700
110 Accounting 205 1700
190 Contracting - 1700

EMPLOYEE - Anak
EMPLOYEE_ID FIRST_NAME LAST_NAME DEPARTMENT_ID
100 Steven King 90
101 Neena Kochhar 90
102 Lex De Haan 90
205 Shelley Higgins 110
206 William Gietz 110

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 11
CHECK
Melihat Foreign Key
• Dalam tabel yang ditampilkan, primary key dari tabel
DEPARTMENTS, department_id, juga muncul di tabel
EMPLOYEES sebagai kolom foreign key
DEPARTMENTS - Induk
DEPARTMENT_ID DEPT_NAME MANAGER_ID LOCATION_ID
90 Executive 100 1700
110 Accounting 205 1700
190 Contracting - 1700

EMPLOYEE - Anak
EMPLOYEE_ID FIRST_NAME LAST_NAME DEPARTMENT_ID
100 Steven King 90
101 Neena Kochhar 90
102 Lex De Haan 90
205 Shelley Higgins 110
206 William Gietz 110

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 12
CHECK
Constraint integritas referensial
• Untuk memenuhi constraint integritas referensial, nilai
foreign key harus cocok dengan nilai yang ada di tabel
induk atau NULL
DEPARTMENTS - Induk
DEPARTMENT_ID DEPT_NAME MANAGER_ID LOCATION_ID
90 Executive 100 1700
110 Accounting 205 1700
190 Contracting - 1700

EMPLOYEE - Anak
EMPLOYEE_ID FIRST_NAME LAST_NAME DEPARTMENT_ID
100 Steven King 90
101 Neena Kochhar 90
102 Lex De Haan 90
205 Shelley Higgins 110
206 William Gietz 110

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 13
CHECK
Constraint integritas referensial
• Nilai primary key dapat ada tanpa nilai foreign key yang
sesuai; namun, foreign key harus memiliki primary key
yang sesuai
DEPARTMENTS - Induk
DEPARTMENT_ID DEPT_NAME MANAGER_ID LOCATION_ID
90 Executive 100 1700
110 Accounting 205 1700
190 Contracting - 1700
EMPLOYEE - Anak
EMPLOYEE_ID FIRST_NAME LAST_NAME DEPARTMENT_ID
100 Steven King 90
101 Neena Kochhar 90
102 Lex De Haan 90
205 Shelley Higgins 110
206 William Gietz 110

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 14
CHECK
Aturan Constraint Referensi-Integritas
• Aturannya adalah: sebelum Anda menetapkan
constraint integritas referensial di tabel anak,
constraint UNIQUE atau PRIMARY KEY yang dirujuk
pada tabel induk harus sudah ditentukan
DEPARTMENTS - Induk
DEPARTMENT_ID DEPT_NAME MANAGER_ID LOCATION_ID
90 Executive 100 1700
110 Accounting 205 1700
190 Contracting - 1700
EMPLOYEE - Anak
EMPLOYEE_ID FIRST_NAME LAST_NAME DEPARTMENT_ID
100 Steven King 90
101 Neena Kochhar 90
102 Lex De Haan 90
205 Shelley Higgins 110
206 William Gietz 110

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 15
CHECK
Aturan Constraint Referensi-Integritas
• Dengan kata lain, Anda harus terlebih dahulu memiliki
primary key induk sebelum Anda dapat membuat
foreign key di tabel anak
DEPARTMENTS - Induk
DEPARTMENT_ID DEPT_NAME MANAGER_ID LOCATION_ID
90 Executive 100 1700
110 Accounting 205 1700
190 Contracting - 1700
EMPLOYEE - Anak
EMPLOYEE_ID FIRST_NAME LAST_NAME DEPARTMENT_ID
100 Steven King 90
101 Neena Kochhar 90
102 Lex De Haan 90
205 Shelley Higgins 110
206 William Gietz 110

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 16
CHECK
Constraint FOREIGN KEY
• Untuk mendefinisikan constraint FOREIGN KEY, adalah
praktik yang baik untuk menggunakan akhiran _fk
dalam nama constraint
• Misalnya, nama constraint untuk kolom FOREIGN KEY
department_id di tabel karyawan bisa dinamai
emps_dept_id_fk

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 17
CHECK
Sintaks Constraint FOREIGN KEY
• Sintaks untuk mendefinisikan constraint FOREIGN KEY
membutuhkan referensi ke tabel dan kolom di tabel
induk
• Constraint FOREIGN KEY dalam pernyataan CREATE
TABLE dapat didefinisikan sebagai berikut
• Contoh sintaks tingkat kolom:
CREATE TABLE copy_employees
(employee_id NUMBER(6,0) CONSTRAINT copy_emp_pk PRIMARY KEY,
first_name VARCHAR2(20),
last_name VARCHAR2(25),
department_id NUMBER(4,0) CONSTRAINT c_emps_dept_id_fk
REFERENCES departments(department_id),
email VARCHAR2(25));

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 18
CHECK
Sintaks constraint foreign key
• Sintaks untuk mendefinisikan constraint FOREIGN KEY
membutuhkan referensi ke tabel dan kolom di tabel
induk
• Constraint FOREIGN KEY dalam pernyataan CREATE
TABLE dapat didefinisikan sebagai berikut
• Contoh sintaks tingkat tabel:
CREATE TABLE copy_employees
(employee_id NUMBER(6,0) CONSTRAINT copy_emp_pk PRIMARY KEY,
first_name VARCHAR2(20),
last_name VARCHAR2(25),
department_id NUMBER(4,0),
email VARCHAR2(25),
CONSTRAINT c_emps_dept_id_fk FOREIGN KEY (department_id)
REFERENCES departments(department_id));

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 19
CHECK
ON DELETE CASCADE - Mempertahankan Integritas
Referensial
• Menggunakan opsi ON DELETE CASCADE saat
mendefinisikan foreign key memungkinkan baris-baris
dependen dalam tabel anak dihapus ketika baris dalam
tabel induk dihapus
• Jika foreign key tidak memiliki opsi ON DELETE
CASCADE, baris yang direferensikan di tabel induk tidak
dapat dihapus
• Dengan kata lain, tabel anak constraint FOREIGN KEY
termasuk izin ON DELETE CASCADE yang
memungkinkan induk untuk menghapus baris yang
dimaksud

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 20
CHECK
ON DELETE CASCADE - Mempertahankan Integritas
Referensial

DEPARTMENTS - Induk
DEPARTMENT_ID DEPT_NAME MANAGER_ID LOCATION_ID
90 Executive 100 1700
110 Accounting 205 1700
190 Contracting - 1700

EMPLOYEE - Anak
EMPLOYEE_ID FIRST_NAME LAST_NAME DEPARTMENT_ID
100 Steven King 90
101 Neena Kochhar 90
102 Lex De Haan 90
205 Shelley Higgins 110
206 William Gietz 110

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 21
CHECK
ON DELETE CASCADE
• Jika kolom department_id di karyawan dibuat dengan
opsi ON DELETE CASCADE yang ditentukan, pernyataan
DELETE yang dikeluarkan pada tabel departemen akan
dijalankan
• Jika opsi ON DELETE CASCADE tidak ditentukan saat
FOREIGN KEY dibuat, upaya untuk menghapus
departemen dari tabel departemen yang memiliki entri
di tabel karyawan akan gagal

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 22
CHECK
Sintaks ON DELETE CASCADE
• Tabel dibuat tanpa ON DELETE CASCADE:
CREATE TABLE copy_employees
(employee_id NUMBER(6,0) CONSTRAINT copy_emp_pk PRIMARY KEY,
first_name VARCHAR2(20),
last_name VARCHAR2(25),
department_id NUMBER(4,0),
email VARCHAR2(25),
CONSTRAINT cdept_dept_id_fk FOREIGN KEY (department_id)
REFERENCES copy_departments(department_id));

• Upaya untuk menghapus department_id 110 dari tabel


departemen gagal karena ada baris bergantung pada
tabel karyawan

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 23
CHECK
Sintaks ON DELETE CASCADE
• Tabel dibuat dengan ON DELETE CASCADE:
CREATE TABLE copy_employees
(employee_id NUMBER(6,0) CONSTRAINT copy_emp_pk PRIMARY KEY,
first_name VARCHAR2(20),
last_name VARCHAR2(25),
department_id NUMBER(4,0),
email VARCHAR2(25),
CONSTRAINT cdept_dept_id_fk FOREIGN KEY (department_id)
REFERENCES copy_departments(department_id) ON DELETE CASCADE);

• Upaya untuk menghapus department_id 110 dari tabel


departemen berhasil, dan baris dependen di tabel
karyawan juga dihapus
• 1 baris dihapus

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 24
CHECK
ON DELETE SET NULL
• Alih-alih menghapus baris di tabel anak saat
menggunakan opsi ON DELETE CASCADE, baris anak
dapat diisi dengan nilai null menggunakan opsi ON
DELETE SET NULL
CREATE TABLE copy_employees
(employee_id NUMBER(6,0) CONSTRAINT copy_emp_pk PRIMARY KEY,
first_name VARCHAR2(20),
last_name VARCHAR2(25),
department_id NUMBER(4,0),
email VARCHAR2(25),
CONSTRAINT cdept_dept_id_fk FOREIGN KEY (department_id)
REFERENCES copy_departments(department_id) ON DELETE SET NULL);

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 25
CHECK
ON DELETE SET NULL
• Ini bisa berguna ketika nilai tabel induk diubah ke
nomor baru seperti mengonversi nomor inventaris
menjadi nomor barcode
• Anda tidak ingin menghapus baris di tabel anak
• Ketika nomor barcode baru dimasukkan ke dalam tabel
induk, mereka kemudian akan dapat dimasukkan ke
dalam tabel anak tanpa harus membuat ulang total
setiap baris tabel anak

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 26
CHECK
Constraint CHECK
• Constraint CHECK secara eksplisit mendefinisikan
ketentuan yang harus dipenuhi
• Untuk memenuhi constraint, setiap baris dalam tabel
harus membuat ketentuan True atau tidak diketahui
(karena null)
• Ketentuan constraint CHECK dapat merujuk ke kolom
apa pun di tabel yang ditentukan, tetapi tidak ke kolom
dari tabel lain

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 27
CHECK
Contoh Constraint CHECK
• Constraint CHECK ini memastikan bahwa nilai yang
dimasukkan untuk end_date lebih akhir dari start_date
CREATE TABLE copy_job_history
(employee_id NUMBER(6,0),
start_date DATE,
end_date DATE,
job_id VARCHAR2(10),
department_id NUMBER(4,0),
CONSTRAINT cjhist_emp_id_st_date_pk
PRIMARY KEY(employee_id, start_date),
CONSTRAINT cjhist_end_ck CHECK (end_date > start_date));

• Karena CONSTRAINT CHECK ini mereferensikan dua


kolom dalam tabel, itu HARUS didefinisikan pada
tingkat tabel
DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 28
CHECK
Ketentuan Constraint CHECK
• Constraint CHECK harus hanya di baris tempat
constraint didefinisikan
• Constraint CHECK tidak dapat digunakan dalam kueri
yang merujuk ke nilai di baris lain
• Constraint CHECK tidak dapat berisi panggilan ke fungsi
SYSDATE, UID, USER, atau USERENV
• Pernyataan CHECK(SYSDATE >'05-May-1999') tidak
diizinkan

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 29
CHECK
Ketentuan Constraint CHECK
• Constraint CHECK tidak dapat menggunakan
pseudocolumn CURRVAL, NEXTVAL, LEVEL, atau
ROWNUM
• Pernyataan CHECK(NEXTVAL > 0) tidak diizinkan
• Satu kolom dapat memiliki beberapa constraint CHECK
yang merujuk kolom dalam definisi
• Tidak ada constraint jumlah Constraint CHECK yang
dapat Anda tentukan pada kolom

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 30
CHECK
Sintaks Constraint CHECK
• Constraint CHECK dapat didefinisikan di tingkat kolom
atau tingkat tabel
• Sintaks untuk mendefinisikan constraint CHECK adalah:
−Sintaks tingkat kolom:
salary NUMBER(8,2) CONSTRAINT employees_min_sal_ck CHECK
(salary > 0)

−Sintaks tingkat tabel:

CONSTRAINT employees_min_sal_ck CHECK (salary > 0)

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 31
CHECK
Terminologi
• Istilah-istilah penting yang digunakan dalam pelajaran
ini di antaranya:
−Constraint CHECK
−Constraint FOREIGN KEY
−REFERENCES
−NOT NULL
−ON DELETE CASCADE
−ON DELETE SET NULL
−Constraint PRIMARY KEY

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 32
CHECK
Rangkuman
• Dalam pelajaran ini, Anda seharusnya telah
mempelajari cara:
−Menentukan dan memberi contoh constraint PRIMARY KEY,
FOREIGN KEY, dan CHECK
−Menjelaskan tujuan menentukan constraint PRIMARY KEY,
FOREIGN KEY, dan CHECK
−Menunjukkan pembuatan constraint pada level kolom dan
level tabel dalam pernyataan CREATE TABLE
−Mengevaluasi masalah bisnis
yang mengharuskan
penambahan constraint
−PRIMARY KEY dan FOREIGN
−KEY serta menuliskan kode
menjalankan perubahan

DP 14-2
Constraint PRIMARY KEY, FOREIGN KEY, dan Hak cipta © 2020, Oracle dan/atau afiliasinya. Semua hak dilindungi undang-undang. 33
CHECK

Anda mungkin juga menyukai