Belajar PostgreSQL 2
Sambungan artikel sebelumnya klik
Hubungan Antar Tabel (Relational). Dalam pembuatan database karyawan biasanya akan dilengkapi oleh data anak pada setiap karyawan dan karena setiap karyawan bisa memiliki anak lebih dari satu, maka kita perlu membuat sebuah tabel tersendiri yaitu tabel anak. Tabel anak akan terhubung dengan tabel karyawan, dan yang menghubungkan diantara kedua tabel tersebut yaitu field id dengan field id_karyawan pada tabel karyawan. Field id merupakan primary key pada tabel anak sedangkan id_karyawan merupakan primary key pada tabel karyawan. Untuk kasus ini berarti field id pada tabel anak ini bisa disebut juga foreign key. Asumsinya adalah bahwa nama anak tidak ada yang sama, maka kita harus menambahkan primary key pada field nama anak. Field nama anak ini sebagai anggota primry key.
latihan=# CREATE TABLE anak (
latihan(# id integer not null
latihan(# references karyawan,
latihan(# nama varchar(50) not null,
latihan(# tgl_lahir date,
latihan(# primary key (id, nama)
latihan(# );
NOTICE: CREATE TABLE / PRIMARY KEY will CREATE implicit INDEX "anak_pkey" FOR TABLE "anak"
CREATE TABLE
Kata REFERENCES karyawan dimaksud adalah untuk memastikan bahwa nilai field pada id dipastikan terdapat pula pada field primary key tabel karyawan.
latihan=# INSERT INTO anak (id, nama, tgl_lahir)
latihan-# VALUES (100, 'Andika Junaedi', '8/18/1994');
INSERT 0 1Coba untuk mengisi nama anak dengan mengacu kepada nilai unik dari id_karyawan pada tabel karyawan:
latihan=# INSERT INTO anak (id, nama, tgl_lahir)
latihan-# VALUES (101, 'Endang Wahyuni','7/7/1995'),(102, 'Famhi Akbar','5/19/1995');
INSERT 0 2Jika field id pada tabel anak diisi dengan nilai yang tidak terdapat pada primary key pada tabel karyawan, maka akan tampil error seperti ini:
latihan=# INSERT INTO anak (id, nama, tgl_lahir)
latihan-# VALUES (103, 'Yuni Sarah','9/12/1996');
ERROR: INSERT OR UPDATE ON TABLE "anak" violates FOREIGN KEY constraint "anak_id_fkey"
DETAIL: KEY (id)=(103) IS NOT present IN TABLE "karyawan".Coba sekarang Anda menghapus salah satu record pada tabel karyawan dan apa yang akan terjadi, pasti akan timbul error seperti ini:
latihan=# DELETE FROM karyawan where id_karyawan = 100;
ERROR: UPDATE OR DELETE ON TABLE "karyawan" violates FOREIGN KEY constraint "anak_id_fkey" ON TABLE "anak"
DETAIL: KEY (id_karyawan)=(100) IS still referenced FROM TABLE "anak".Ini dikarenakan nilai primary key id_karyawan pada tabel karyawan sedang digunakan oleh tabel anak. Solusi dari kasus ini, tabel anak harus ditambah dengan fungsi CASCADE:
latihan=# CREATE TABLE anak (
latihan(# id integer not null
latihan(# references karyawan on delete cascade,
latihan(# nama varchar(50) not null,
latihan(# tgl_lahir date,
latihan(# primary key (id, nama)
latihan(# );
NOTICE: CREATE TABLE / PRIMARY KEY will CREATE implicit INDEX "anak_pkey" FOR TABLE "anak"
CREATE TABLECoba Anda masukkan kembali data anaknya, dan ujicobalah pengapusan data karyawan berdasarkan id_karyawan, Apa yang terjadi??
latihan=# DELETE FROM karyawan where id_karyawan = 100;
DELETE 1Bahkan kita bisa mengupdate isi field id pada tabel anak sehingga dapat mempengaruhi isi field id_karyawan pada tabel karyawan, Sekarang Anda rubah terlebih dahulu struktur tabel anaknya menjadi seperti dibawah ini:
latihan=# CREATE TABLE anak (
latihan(# id integer not null
latihan(# references karyawan
latihan(# on delete cascade
latihan(# on update cascade,
latihan(# nama varchar(50) not null,
latihan(# tgl_lahir date,
latihan(# primary key (id, nama)
latihan(# );
NOTICE: CREATE TABLE / PRIMARY KEY will CREATE implicit INDEX "anak_pkey" FOR TABLE "anak"
CREATE TABLESekarang kita lihat terlebih dahulu semua data pada kedua table karyawan dan anak:
latihan=# select *from karyawan;
id_karyawan | nama
-------------+-------------
101 | Ani Setiani
102 | Andrianto
(2 rows)latihan=# select *from anak;
id | nama | tgl_lahir
-----+----------------+------------
101 | Endang Wahyuni | 1995-07-07
102 | Famhi Akbar | 1995-05-19
(2 rows)Sekarang ujicoba untuk mengaupdate data id_karyawan:
latihan=# UPDATE karyawan
latihan-# set id_karyawan = 103
latihan-# where id_karyawan = 102;
UPDATE 1Sekarang lihat apakah yang terjadi pada kedua tabel terserbut, Apakah ada perubahan data pada id_karyawan??
latihan=# select *from karyawan;
id_karyawan | nama
-------------+-------------
101 | Ani Setiani
103 | Andrianto
(2 rows)latihan=# select *from anak;
id | nama | tgl_lahir
-----+----------------+------------
101 | Endang Wahyuni | 1995-07-07
103 | Famhi Akbar | 1995-05-19
(2 rows)










/rating_on.png)
/rating_half.png)
(3.50 out of 5)















