Tabel dengan PRIMARY KEY
PRIMARY KEY
-
untuk menjadikan filed kunci agar tidak terjadi
duplikasi data
CODE :
mysql> create table t_pegawai(id_peg varchar(8)
primary key, nama_peg varchar(50), alamat_peg varchar(50));
Query OK, 0 rows affected (0.07 sec)
LIHAT DESKRIPSINYA
mysql> desc t_pegawai;
+------------+-------------+------+-----+---------+-------+
|
Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
|
id_peg | varchar(8) | NO
| PRI | NULL | |
|
nama_peg | varchar(50) | YES | |
NULL | |
|
alamat_peg | varchar(50) | YES | | NULL
| |
+------------+-------------+------+-----+---------+-------+
3
rows in set (0.01 sec)
ISI
TABELNYA
mysql> select*from t_pegawai;
+---------+----------+------------+
|
id_peg | nama_peg | alamat_peg |
+---------+----------+------------+
|
HRD-001 | Chandra | Jakarta |
|
HRD-002 | Cindy | Bandung |
+---------+----------+------------+
2
rows in set (0.00 sec)
LIHAT ERRORNYA..
mysql> insert into t_pegawai
values('HRD-001','Budi','Jogja');
ERROR 1062 (23000): Duplicate entry 'HRD-001' for key 'PRIMARY'
Table dengan nilai UNIQUE
- memberikan batasan bahwa nilai dalam sebuah kolom harus distinct (atau tidak ada
data yang nilainya
sama)
CODE:
mysql>
create table t_parkir(id_parkir varchar(5) primary key, plat_no varchar(12),
merk varchar(10), UNIQUE(plat_no));
Query OK, 0 rows affected (0.09 sec)
LIHAT DESKRIPSINYA…
mysql> desc t_parkir;
+-----------+-------------+------+-----+---------+-------+
|
Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
|
id_parkir | varchar(5) | NO | PRI | NULL |
|
|
plat_no | varchar(12) | YES | UNI | NULL |
|
|
merk | varchar(10) | YES | |
NULL | |
+-----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
ISI TABEL
mysql> select*from t_parkir;
+-----------+------------+--------+
|
id_parkir | plat_no | merk |
+-----------+------------+--------+
|
11101 | AB-1234-OP | TOYOTA |
|
11102 | B-3454-SDE | BMW |
+-----------+------------+--------+
2 rows in set (0.00 sec)
LIHAT ERRORNYA..
mysql> insert into t_parkir
values('11103','AB-1234-OP','JAGUAR');
ERROR 1062 (23000): Duplicate entry
'AB-1234-OP' for key 'plat_no'
Tabel dengan FOREIGN KEY
- satu
atau beberapa kolom pada table yang merupakan primary key pada table satu namun
diletakan pada table dimana tablenya berelasi dengan table dirinya
Misal kita punya dua tabel yang saling berkaitan contoh :
- tabel induk
: t_mobil dengan field(id_mobil,
type)
- tabel anak
: t_stok dengan field(id_stok, id_mobil,
stok)
Kita buat dulu tabel induknya :
mysql> create table t_mobil(id_mobil
varchar(8) primary key, type varchar(20));
Query OK, 0 rows affected (0.07 sec)
mysql> desc t_mobil;
+----------+-------------+------+-----+---------+-------+
|
Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
|
id_mobil | varchar(8) | NO | PRI | NULL |
|
|
type | varchar(20) | YES | |
NULL | |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
Isi tabel :
mysql> select*from t_mobil;
+----------+--------+
|
id_mobil | type |
+----------+--------+
|
HON-01 | Jazz |
|
TOY-01 | Avanza |
|
TOY-02 | Innova |
+----------+--------+
3 rows in set (0.00 sec)
Buat tabel anak :
mysql>
create table t_stok(id_stok varchar(8) primary key, id_mobil varchar(8), stok
int(5), foreign key(id_mobil) references
t_mobil(id_mobil));
Query OK, 0 rows affected (0.08 sec)
mysql> desc t_stok;
+----------+------------+------+-----+---------+-------+
|
Field | Type | Null | Key | Default | Extra |
+----------+------------+------+-----+---------+-------+
|
id_stok | varchar(8) | NO | PRI | NULL |
|
|
id_mobil | varchar(8) | YES | MUL |
NULL | |
|
stok | int(5) | YES
| | NULL |
|
+----------+------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
ISI
TABEL :
mysql> select*from t_stok;
+---------+----------+------+
|
id_stok | id_mobil | stok |
+---------+----------+------+
|
ST-001 | TOY-01 | 1000 |
|
ST-002 | TOY-02 | 521
|
|
ST-003 | HON-01 | 875
|
+---------+----------+------+
3 rows in set (0.00 sec)
Kita akan buktikan apakah FOREIGN KEY kita
berfungsi dengan baik, kita bisa menggunakan code :
mysql> delete from t_mobil
where id_mobil='TOY-01';
ERROR 1451 (23000): Cannot delete or update a
parent row: a foreign key constraint fails (`minggu2`. t_stok`, CONSTRAINT
`t_stok_ibfk_1` FOREIGN KEY (`id_mobil`) REFERENCES `t_mobil` (`id_mobil`))
Maksudnya adalah tidak
dapat menghapus atau mengupdate kolom pada table induk karena bereferensi pada
table t_stok.
Lalu
bagaimana solusinya?
Pada MYSQL, kita harus
menambahkan perintah ON DELETE [opsi] dan ON UPDATE [opsi]pada table yang
mereferensikan foreign key. Opsi pada perintah tersebut jelasnya dibawah ini.
A. RESTRICT
Jika
tabel anak berisi nilai dalam kolom yang mengkait yang nilainya sama dengan di
kolom terkait pada tabel induk, baris dalam tabel induk tidak bisa dihapus, dan
nilai di kolom terkait tidak dapat diupdate. Ini adalah opsi default jika
klausa ON DELETE atau ON UPDATE tidak dispesifikasikan.
B. CASCADE
Baris-baris
dalam tabel anak yang berisi nilai-nilai yang juga terdapat dalam kolom terkait
dari tabel induk dihapus ketika barisbaris yang berkaitan dihapus dari tabel
induk. Baris-baris dalam tabel anak yang berisi nilai-nilai yang juga terdapat
dalam kolom terkait dari tabel induk diupdate ketika nilai-nilai yang berkaitan
diupdate dalam tabel induk.
C. SET NULL
Nilai-nilai
dalam kolom yang mengkait dari tabel anak diset ke NULL saat baris-baris dengan
data terkait dalam tabel induk dihapus dari tabel induk atau ketika data
terkait dalam tabel induk diupdate. Untuk menggunakan opsi ini, semua
kolom-kolom yang mengkait dalam tabel anak harus mengijinkan nilai NULL.
D. NO ACTION
Tidak
ada aksi yang diambil dalam tabel anak ketika baris-baris dihapus dari tabel
induk atau nilai-nilai dalam kolom terkait dalam tabel induk diupdate.
E. SET DEFAULT
Nilai-nilai
dalam kolom-kolom yang mengkait dari tabel anak diset ke nilai default mereka
ketika baris-baris dihapus dari tabel induk atau kolom terkait dari tabel induk
diupdate.
Untuk kali ini kita akan belajar
tentang CASCADE, jadi data yang terdapat di tabel induk dan tabel anak akan
sama – sama terhapus atau terupdate.
Langkah pertama kita ganti struktur
dari tabel anak agar memuat perintah untuk mengaktifkan “fitur” CASCADE
Hapus dulu tabel t_stok.
Mysql> drop table t_stok;
Rubah struktur tabel t_stok
mysql> create table t_stok(id_stok varchar(8)
primary key, id_mobil varchar(8), stok int(5), foreign key(id_mobil) references
t_mobil(id_mobil) on delete cascade on
update cascade);
Query OK, 0 rows affected (0.06 sec)
mysql> desc t_stok;
+----------+------------+------+-----+---------+-------+
|
Field | Type | Null | Key | Default | Extra |
+----------+------------+------+-----+---------+-------+
|
id_stok | varchar(8) | NO | PRI | NULL |
|
|
id_mobil | varchar(8) | YES | MUL |
NULL | |
|
stok | int(5) | YES
| | NULL |
|
+----------+------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
Isi
tabelnya lagi
mysql> insert into t_stok
values('ST-001','TOY-01','1000'),('ST-002','TOY-02','521'),('ST-003','HON-01','875');
Query OK, 3 rows affected (0.01 sec)
Records: 3
Duplicates: 0 Warnings: 0
mysql> select*from t_stok;
+---------+----------+------+
|
id_stok | id_mobil | stok |
+---------+----------+------+
|
ST-001 | TOY-01 | 1000 |
|
ST-002 | TOY-02 | 521
|
|
ST-003 | HON-01 | 875
|
+---------+----------+------+
3
rows in set (0.00 sec)
Setelah
itu, kita coba delete lagi :
mysql> delete from t_mobil
where id_mobil='TOY-01';
Query OK, 1 row affected (0.01
sec)
Kita
lihat hasilnya…
mysql> select*from t_mobil;
+----------+--------+
|
id_mobil | type |
+----------+--------+
|
HON-01 | Jazz |
|
TOY-02 | Innova |
+----------+--------+
2 rows in set (0.01 sec)
mysql> select*from t_stok;
+---------+----------+------+
|
id_stok | id_mobil | stok |
+---------+----------+------+
|
ST-002 | TOY-02 | 521
|
|
ST-003 | HON-01 | 875
|
+---------+----------+------+
2 rows in set (0.00 sec)
Jadi setelah
kita rubah struktur tabel anak, maka akan bisa ter delete.
Data
di tabel anak dan induk akan sama – sama ter hapus atau ter update.
Itulah
contoh penggunaan on delete cascade dan on upodate cascade
0 komentar :
Posting Komentar