π Pengenalan Function di SQL (MySQL)
βοΈ Perbedaan Function, Procedure, dan Trigger
| Aspek | Function | Procedure | Trigger |
|---|---|---|---|
| Return Value | β Wajib mengembalikan 1 nilai | β Tidak wajib return nilai | β Tidak return, hanya menjalankan aksi |
| Pemanggilan | Di dalam query (SELECT, WHERE, dll) | Dengan CALL | Otomatis saat INSERT/UPDATE/DELETE |
| Tujuan Utama | Perhitungan, transformasi, konversi | Menangani logika kompleks | Tindakan otomatis setelah event DB |
| Bisa Ubah Data | β Tidak boleh | β Boleh | β Boleh |
| Contoh Penggunaan | SELECT fungsi(...) | CALL prosedur(...) | Aktif otomatis |
π Apa Itu Function di SQL?
Function (fungsi) di SQL adalah blok kode yang menerima input dan mengembalikan 1 nilai sebagai hasil. Biasanya digunakan untuk menghitung, mengubah, atau mengevaluasi sesuatu β dan bisa dipakai berulang kali di query.
π§ Best Practice Function
- β Fokus pada satu tugas: perhitungan atau pengecekan.
- π Gunakan jika fungsinya sering dipakai ulang di banyak query.
- π Hindari melakukan perubahan data (INSERT, UPDATE, DELETE) di dalam function.
- π§Ό Gunakan nama yang deskriptif dan jelas.
- π Tambahkan kata
DETERMINISTICjika hasil dari input yang sama selalu sama.
π οΈ Format Umum Function di MySQL
DELIMITER //
CREATE FUNCTION nama_function(parameter TipeData)
RETURNS TipeData
DETERMINISTIC
BEGIN
-- logika
RETURN hasil;
END //
DELIMITER ;
`
π§ͺ Contoh Function
1οΈβ£ Function
ppn(harga)
β Hitung Harga + PPN 11%
Fungsi ini menambahkan PPN 11% ke suatu harga. Misalnya, jika harga 100.000 β hasilnya 111.000
DELIMITER //
CREATE FUNCTION ppn(harga DOUBLE)
RETURNS DOUBLE
DETERMINISTIC
BEGIN
RETURN harga * 1.11;
END //
DELIMITER ;
π§Ύ Contoh Pemakaian:
SELECT ppn(100000); -- hasil: 111000
2οΈβ£ Function
cek_owner(owner_id)
β Deteksi Jenis Owner
Fungsi ini mengembalikan:
- ‘inn’ jika owner_id = 28
- ‘mitra’ jika bukan 28
DELIMITER //
CREATE FUNCTION cek_owner(owner_id INT)
RETURNS VARCHAR(10)
DETERMINISTIC
BEGIN
IF owner_id = 28 THEN
RETURN 'inn';
ELSE
RETURN 'mitra';
END IF;
END //
DELIMITER ;
π§Ύ Contoh Pemakaian di Query:
SELECT
id_depo,
nama_depo,
owner_id,
cek_owner(owner_id) AS tipe_owner
FROM depo;
Hasilnya akan ada kolom tambahan tipe_owner yang berisi ‘inn’ atau ‘mitra’.
π Cara Cek dan Hapus Function
- β Lihat semua function di database:
SHOW FUNCTION STATUS WHERE Db = 'nama_database';
- ποΈ Hapus function jika perlu:
DROP FUNCTION IF EXISTS nama_function;
π§ Rangkuman
| Hal | Penjelasan Singkat |
|---|---|
| Fungsi SQL | Blok logika yang menerima input dan mengembalikan 1 nilai |
| Tujuan | Perhitungan, format data, validasi ringan |
| Keunggulan | Bisa dipakai ulang, hemat penulisan query |
| Tidak Cocok | Untuk proses yang ubah data (gunakan procedure/trigger) |
π§ Panduan Lengkap MySQL TRIGGER
π Apa Itu TRIGGER?
TRIGGER adalah fitur di MySQL yang memungkinkan kita mengeksekusi perintah SQL secara otomatis ketika terjadi perubahan pada suatu tabel. Perubahan ini bisa berupa INSERT, UPDATE, atau DELETE.
Trigger berguna untuk:
- Logging otomatis
- Backup data sebelum dihapus/diubah
- Validasi atau modifikasi nilai sebelum disimpan
βοΈ Struktur Umum TRIGGER
CREATE TRIGGER nama_trigger
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON nama_tabel
FOR EACH ROW
BEGIN
-- Aksi SQL
END;
`
| Elemen | Fungsi |
|---|---|
| BEFORE | Trigger jalan sebelum perubahan |
| AFTER | Trigger jalan setelah perubahan |
| INSERT, UPDATE, DELETE | Jenis perubahan data |
| FOR EACH ROW | Trigger dijalankan untuk setiap baris |
| NEW | Data baru (setelah perubahan) |
| OLD | Data lama (sebelum perubahan) |
β Kelebihan Trigger
- Otomatisasi: Mengurangi kebutuhan kode aplikasi untuk tugas-tugas berulang (misalnya backup, logging).
- Konsistensi Data: Validasi dan pembersihan data bisa dipastikan di level database.
- Audit Trail: Perubahan pada data bisa langsung dicatat otomatis ke tabel log.
- Pencegahan Error: Bisa mencegah input nilai yang salah, seperti stok negatif, sebelum data disimpan.
β οΈ Kekurangan Trigger
- Sulit Dideteksi Saat Error: Jika ada kesalahan dalam kode trigger, proses INSERT, UPDATE, atau DELETE bisa gagal tanpa error yang jelas di level aplikasi.
- Sulit Debugging: Perubahan data terjadi βdi belakang layarβ, menyulitkan pengembang untuk melacak apa yang salah.
- Memperlambat Proses Transaksi: Di tabel dengan trafik tinggi, seperti tabel transaksi (sales, orders, dll), penggunaan trigger dapat memperlambat kinerja, terutama jika logika trigger berat.
- Terbatas Satu Jenis per Aksi: Hanya bisa ada 1 trigger per jenis aksi per tabel (misal hanya 1 BEFORE UPDATE di tabel produk).
- Tidak Bisa Commit/Rollback dalam Trigger.
- Tidak Support Langsung Multi-Table Cascade Logic seperti di foreign key.
π§ Penjelasan
OLD dan NEW di Trigger MySQL
| Jenis Trigger | Bisa Pakai OLD? | Bisa Pakai NEW? |
|---|---|---|
| BEFORE INSERT | β Tidak bisa | β Bisa |
| AFTER INSERT | β Tidak bisa | β Bisa |
| BEFORE UPDATE | β Bisa | β Bisa |
| AFTER UPDATE | β Bisa | β Bisa |
| BEFORE DELETE | β Bisa | β Tidak bisa |
| AFTER DELETE | β Bisa | β Tidak bisa |
β NEW digunakan untuk data baru
Contoh: data yang akan atau baru saja disimpan
β OLD digunakan untuk data lama
Contoh: data yang akan diubah atau akan dihapus
π 1. BEFORE INSERT
CREATE TRIGGER before_insert_user
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
-- β OLD tidak bisa dipakai (data lama belum ada)
-- β
NEW bisa dipakai untuk ubah data yang akan disimpan
SET NEW.created_at = NOW();
END;
π Penjelasan:
Sebelum data disimpan ke tabel, kita bisa βmenyentuhβ NEW, karena itu data yang akan disimpan. Tapi tidak ada OLD, karena sebelumnya belum ada data.
π 2. AFTER INSERT
CREATE TRIGGER after_insert_log
AFTER INSERT ON transaksi
FOR EACH ROW
BEGIN
-- β OLD tidak tersedia
-- β
NEW bisa dipakai untuk log
INSERT INTO transaksi_log (trx_id, aksi)
VALUES (NEW.id, 'INSERT');
END;
π Penjelasan:
Setelah data disimpan, kita bisa akses data barunya lewat NEW, misalnya untuk dicatat ke log. Tapi tidak ada OLD karena tidak ada data lama.
π 3. BEFORE UPDATE
CREATE TRIGGER before_update_produk
BEFORE UPDATE ON produk
FOR EACH ROW
BEGIN
-- β
OLD = nilai sebelum update
-- β
NEW = nilai yang akan ditulis
IF NEW.harga < OLD.harga THEN
SET NEW.diskon = OLD.harga - NEW.harga;
END IF;
END;
π Penjelasan:
Kita bisa bandingkan nilai lama (OLD) dan nilai baru (NEW) sebelum update terjadi.
π 4. AFTER UPDATE
CREATE TRIGGER after_update_status
AFTER UPDATE ON orders
FOR EACH ROW
BEGIN
-- β
OLD = status lama
-- β
NEW = status baru
INSERT INTO order_log (order_id, dari_status, ke_status)
VALUES (NEW.id, OLD.status, NEW.status);
END;
π Penjelasan:
Setelah update berhasil, kita bisa simpan histori perubahan dengan membandingkan OLD dan NEW.
π 5. BEFORE DELETE
CREATE TRIGGER before_delete_user
BEFORE DELETE ON users
FOR EACH ROW
BEGIN
-- β
OLD = data yang akan dihapus
-- β NEW tidak ada (data baru tidak ada karena ini DELETE)
INSERT INTO deleted_users (nama, email)
VALUES (OLD.nama, OLD.email);
END;
π Penjelasan:
Sebelum data dihapus, kita hanya bisa akses OLD, karena tidak akan ada data baru (NEW tidak relevan di sini).
π 6. AFTER DELETE
CREATE TRIGGER after_delete_produk
AFTER DELETE ON produk
FOR EACH ROW
BEGIN
-- β
OLD = data yang baru saja dihapus
-- β NEW tidak ada
INSERT INTO produk_log (produk_id, aksi)
VALUES (OLD.id, 'DELETED');
END;
π Penjelasan:
Setelah data dihapus, kita masih bisa akses data lama (OLD) yang tadi dihapus. Tapi tidak ada NEW karena data baru tidak ada.
π§Ύ Kesimpulan Intuitif
| Aksi | Logika | Bisa akses OLD? | Bisa akses NEW? |
|---|---|---|---|
| INSERT | Data baru ditambahkan | β Tidak ada data lama | β Data yang akan disimpan |
| UPDATE | Data lama diganti dengan baru | β Data sebelum update | β Data baru |
| DELETE | Data lama dihapus | β Data yang akan dihapus | β Tidak ada data baru |
Kalau Mas San mau, Bam bisa tambahkan penjelasan ini ke file Markdown yang kemarin, atau bantu buat versi visual/diagram alurnya juga. Gimana?
π Manajemen Trigger
Lihat Semua Trigger
SHOW TRIGGERS;
Hapus Trigger
DROP TRIGGER IF EXISTS nama_trigger;
π― Kapan Menggunakan Trigger?
| Situasi | Gunakan Trigger? |
|---|---|
| Backup otomatis | β |
| Logging histori perubahan | β |
| Validasi data yang kompleks | β |
| Tabel transaksi berisi ribuan query/detik | β οΈ hati-hati |
| Proyek kecil/menengah dengan data penting | β |
| Ingin semua logic terlihat di kode backend | β |
π§© Tips Praktis
- Gunakan nama trigger yang deskriptif: before_insert_log, after_update_stock.
- Pisahkan trigger berat ke job async jika performa jadi isu.
- Selalu test trigger di dev environment sebelum deploy ke production.
- Tambahkan logging di trigger untuk melacak error/aktivitas.
π Penutup
TRIGGER adalah alat yang powerful untuk memastikan database berjalan otomatis dan terjaga. Namun, ia ibarat pedang bermata dua β salah sedikit bisa membuat data gagal masuk, atau bahkan memperlambat sistem tanpa disadari. Gunakan dengan bijak dan terukur.