Mengenal Trigger di MySQL
Menurut Wikipedia, trigger dalam database diartikan sebagai “procedural code that is automatically executed in response to certain events on a particular table or view in a database“. Singkatnya, trigger merupakan sekumpulan perintah atau sintaks yang akan secara otomatis dijalankan jika terjadi operasi tertentu dalam tabel atau view. Trigger digunakan untuk memanggil satu atau beberapa perintah SQL secara otomatis sebelum atau sesudah terjadi proses INSERT, UPDATE atau DELETE dari suatu tabel. Sebagai contoh misalnya kita ingin menyimpan id pelanggan secara otomatis ke tabel ‘log’ sebelum menghapus data di tabel pelanggan.
Di MySQL, Triggers mulai dikenal di versi MySQL 5.0, dan di versi saat ini (5.1.4) fungsionalitasnya sudah bertambah. Pada versi selanjutnya pihak pengembang MySQL berjanji akan lebih menguatkan (menambah) fitur trigger ini.
Trigger sering digunakan, antara lain untuk:
- Melakukan update data otomatis jika terjadi perubahan. Contohnya adalah dalam sistem penjualan, jika dientri barang baru maka stock akan bertambah secara otomatis.
- Trigger dapat digunakan untuk mengimplementasikan suatu sistem log. Setiap terjadi perubahan, secara otomatis akan menyimpan ke tabel log.
- Trigger dapat digunakan untuk melakukan validasi dan verifikasi data sebelum data tersebut disimpan.
Membuat Trigger Baru
Berikut ini bentuk umum perintah untuk membuat triggers:
CREATE TRIGGER name [BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON tablename FOR EACH ROW statement
Keterangan dari bentuk umum perintah membuat trigger:
- name, Nama trigger mengikuti peraturan penamaan variabel / identifier dalam MySQL
- [BEFORE | AFTER] digunakan untuk menentukan kapan proses secara otomatis akan dieksekusi, sebelum atau sesudah proses.
- [INSERT | UPDATE | DELETE] digunakan untuk menentukan event (proses) yang dijadikan trigger (pemicu) untuk menjalankan perintah-perintah di dalam triggers.
- tablename, merupakan nama tabel dimana trigger berada.
- statement, merupakan sekumpulan perintah atau query yang akan secara otomatis dijalankan jika event / proses yang didefinisikan sebelumnya aktif.
Statement atau perintah dalam trigger dapat berupa satu perintah saja, dan dapat juga beberapa perintah sekaligus. Jika terdapat beberapa perintah dalam trigger, maka gunakan perintah BEGIN dan END untuk mengawali dan mengakhiri perintah.
Di dalam statement trigger, kita dapat mengakses record tabel sebelum atau sesudah proses dengan menggunakan NEW dan OLD. NEW digunakan untuk mengambil record yang akan diproses (insert atau update), sedangkan OLD digunakan untuk mengakses record yang sudah diproses (update atau delete).
Berikut ini contoh trigger yang akan mencatat aktivitas ke tabel log setiap terjadi proses insert ke tabel pelanggan:
DELIMITER $$
CREATE TRIGGER penjualan.before_insert BEFORE INSERT ON penjualan.pelanggan
FOR EACH ROW BEGIN
INSERT INTO `log` (description, `datetime`, user_id)
VALUES (CONCAT('Insert data ke tabel pelanggan id_plg = ', NEW.id_pelanggan), now(), user());
END;
$$
DELIMITER ;
Menghapus Trigger
Untuk menghapus trigger, dapat menggunakan perintah DROP TRIGGER dengan diikuti dengan nama tabel dan nama triggernya. Berikut ini bentuk umum dan contoh perintah untuk menghapus trigger.
Bentuk umum dan contoh menghapus trigger:
DROP TRIGGER tablename.triggername;
Contoh menghapus trigger bernama ‘before_insert’ yang ada di tabel pelanggan.
DROP TRIGGER penjualan.before_insert;
Sumber: Buku MySQL 5: Dari Pemula Hingga Mahir oleh Achmad Solichin
masih gak mudeng saya pak tentang trigger di mysql >.<
.-= Kus Andriadi´s last blog ..[Java] Belajar IoC dengan Spring Framework =-.
iya euy sama aku juga belum connect euy xixixi………..
klo misalkan gni pak, ada tabel barang, ditabel barang ada field jumlah barang. trus ada tabel penjualan. nah ketikan kita ada transaksi penjualan otomatis jumlah barangnya kan berkurang tu. trus skrip triggernya gmn tu pak. terimakasih
#bhaktiardi
mungkin maksudnya trigger spt dibawah ini.
makasih mas,tutorialnya mudah banget dipahami.Saya mo tanya misalkan dibuat trigger untuk insert data baru, kemudian setelah itu update kolom tertentu pada tabel yang sama caranya gimana ya..?misalkan,tabel pinjaman, insert NoKas keluar,NoAnggota,Pinjaman,BungaPinjaman trus langsung update field jumlahbunga (Pinjaman * bungaPinjaman)…Makasih jawabannya
Mas Achmatim maaf kalau pertanyaan saya tdk ada hub dengan tulisan mas diatas. Pertanyaan ini sudah saya buat di forum dan ada teman memberi info dgn menggunkan trigger. Jadi saya tanya samaa om google, jadi di temukan alamat mas ini.
Pertanyaan saya:
Saya mempunyai 2 table
karyawan: nokpj
nmpeg
tgl_lahir
dll
upah: nokpj
tahun
upahjan
upahfeb
dll
Bgm caranya insert di table karyawan, tapi nokpj nya akan masuk juga di table
upah.
Saya menggunakan mysql, terimakasih mas utk informasinya
#iyak
Salam kenal mas iyak,
Ya paling tepat memang menggunakan trigger. Jadi agar saat insert ke table karyawan otomatis nokpj masuk ke tabel upah, triggernya kurang lebih sbb:
DELIMITER $$
CREATE TRIGGER trig_on_karyawan_insert AFTER INSERT ON karyawan
FOR EACH ROW BEGIN
INSERT INTO upah (nokpj) VALUES NEW.nokpj;
END;
$$
DELIMITER ;
Selamat mencoba
Mohon informasi Bapak.. Saya masih bingung cara membuat Trigger pada Visual Studio 2008 (VB) dengan database MySQL dan Conector/NET. Cara membuat Trigger dari jendela Server Explorer bagaimana ya? Mohon langkah-langkahnya. Terima kasih.
saya punya table
tr_in : tr_inID,poID,requesID
dan tr_in_detail : tr_inID,merk,type
supaya tr_inID nya tr_in masuk ke tr_in_detail gmana caranya ya master
dengan asumsi saat input beberapa merk di tr_in_detail, tr_inID ngikut juga
makasih para master…
Perkenalkan nama saya Yenda Purbadian.
Sebelumnya maaf kalau email saya ini mengganggu waktu Bapak.
Begini Pak, saya belum begitu tahu bagaimana cara membuat Foreign Key/Kunci Tamu dan membuat relasi antar tabel di MySQL. terus MySQL 5 sama MySQL AppServ ada perbedaan tidak dalam penulisan syntaknya?
Mohon Bantuanya.
Terima Kasih
Salam
Yenda Purbadian
pak.jika kita ingin membuat log keseluruhan dari database terebut,berarti kita harus membuat trigger untk masing2 table??jika iya,apakah tidak memberatkan database??
terimakasih pak…
mo taya soal trigger penjualan , gmn caranya saat kita hapus no_bukti transaksi maka pada detail transaksi pun detail dari no_bukti terhapus .. dan stok barang’y kembali ke stok masing2 ..
lagi binggung buat trigger penjualan ni , tolong dibantu y .. jadi begini tabelnya
+———+——————-+———–+
| barang | detail_transaksi | transaksi |
+———+——————-+—–+——
| idbar | iddt | idtrx |
| kobar | idtr | tglinput |
| nabar | tgltrx | konsumen |
| idkat | idbar | total |
| stokmin | item | keterang |
| stokx | harga | |
| harga | int(11) | |
+———+————-+——+—–+—–
nah gmn saat ane hapus idtrx(transaksi) maka pada detail idtr(detailtransaksi) juga ke hapus .. lalu item yang sudah di hpus di detail transaksi kembali ke stok masing2
pak, saya sudah membuat triggernya..
untuk melihat isi dari trigger tersebut bagaimana caranya?
dan, trigger itu kan log, apakah ada file nya di direktori ?
trims
bro..aq mo nanya nich tentang penulisan query phpadmin (mysql)..!
query insert 100 rows kedalam 1 bh table sekaligus…?tanpa kita masukan satu persatu kedalam tabel tersebut..contohnya (name table: test, field name : id_test)…
mohan jawaban nya ya bro kirim ke email saya..!!
trim’s sebelumnya
Perlu dipahami bahwa, tidak ada cara penulisan query insert 100 baris data hanya dengan 1 atau 2 baris perintah, kecuali kalo emang sudah ada datanya di tabel mysql. Yang bisa dilakukan adalah dengan menyingkat perintah query menjadi:
INSERT INTO tabel(field1, field2, field3) VALUES (‘isi1′, ‘isi2′, ‘isi3′), (‘isi1′, ‘isi2′, ‘isi3′), (‘isi1′, ‘isi2′, ‘isi3′), ….. (‘isi1′, ‘isi2′, ‘isi3′);
Kalo datanya sudah ada di file, mending gunakan PHP untuk membaca data tersebut dan meng-insert-kan ke mysql.
Mas Achmatim maaf kalau pertanyaan saya tdk ada hub dengan tulisan mas diatas.
saya mau tanya.
saya punya tabel. begini tabelnya.
nama tabel: nilai= id, nama, nila1, nilai2, jumlah
pertanyaanya, ketika saya insert id, nama, nilai1, nilai2 saja.
bagaimana caranya supaya kolom jumlah bisa terisi otomatis.
kolom jumlah=nilai1+nilai2. saya pakek mysql.
kalau pakai SELECT SUM(nilai1+nilai2) AS jumlah FROM nilai;
ga bisa masuk kedatabasenya(jumlah masih null)
mohon bantuanya pak.
terimah kasih
Bikin aja trigger on INSERT dan on UPDATE yang akan mengupdate field jumlah dengan penjumlahan nilai1 dan nilai2
Bisa dicontohin triggernya ga pak..
bingung.,masih belajar soalnya,
sebelumnya terimah kasih banyak pak.
coba baca dulu buku MySQL5 yang saya share di web ini, mengenai trigger. dicoba contoh-contohnya, lalu buat trigger sendiri sesuai kebutuhan. itu namanya belajar.
master, saya mau tanya, misal saya punya tabel berita trus ada field ‘status’ nah saya mau update status tersebut menjadi arsip. misal
insert berita statusnya=0 akan dirubah menjadi status=1 jika sudah selama 30 hari dari pertama input. master.. help me doongg…! tx before
saya pakai ini tapi ga bisa juga..
CREATE TRIGGER ‘autoupdate’
AFTER INSERT ON `beritacamp` FOR EACH ROW
BEGIN
update beritacamp set status=’1′ where ADDDATE(`tanggal`, INTERVAL 31 DAY)
END
ap saya salah koding nya atau dimananya sih meski di pasang syntak trsb.
Untuk solusi kasus tersebut, tidak bisa menggunakan trigger, tapi bisa menggunakan EVENT. Coba cek di manual: http://dev.mysql.com/doc/refman/5.1/en/create-event.html
mas gmna cara menggunakan trigger pada java, untuk update data stock barang scara otomatis..?/
mau tanya,..saya punya data dalam .txt yang isinya seperti ini,
IP MacAddress OS
xxxx1 yyyyyyyyy ubuntu
xxxx2 yyyyyyyyy Windows
xxxx3 yyyyyyyyy ubuntu
xxxx4 yyyyyyyyy Mac
untuk menginput data tersebut ke database saya gunakan metode load data pada SQL,.
karena datanya akan selalu diupdate. bagaimana agar bisa diketahui total pengguna ubuntu, windows dan os lainnya setiap kali update selain itu bagaimana agar data yang telah diupdate juga masih bisa dipanggil lagi
yang diinginkan 1 :
OS total
ubuntu 3
Windows 2
Mac 1
yang diinginkan 2 :
tanggal : 1 agustus 2012
IP MacAddress OS
xxxx1 yyyyyyyyy ubuntu
xxxx2 yyyyyyyyy Windows
xxxx3 yyyyyyyyy ubuntu
xxxx4 yyyyyyyyy Mac
tanggal : 3 agustus 2012
IP MacAddress OS
xxxx1 yyyyyyyyy ubuntu
xxxx2 yyyyyyyyy Windows
xxxx3 yyyyyyyyy ubuntu
xxxx4 yyyyyyyyy Mac
xxxx5 yyyyyyyyy windows
mohon pencerahaannya?
@akrom. Saya ingin bertanya dulu, “metode load data” yang dimaksud menggunakan cara manual (mungkin pake mysql client), atau cara otomatis menggunakan trigger atau cron di programming tertentu? Yang jelas, pada saat load data harus dicatat waktu loadnya agar dapat menghasilkan bentuk laporan yang kedua, yaitu per-tanggal.
Untuk yg pertama bisa pake GROUP BY sbg contoh:
SELECT os, COUNT(*) FROM tabel GROUP BY os
Tentang perintah GROUP BY dapat dipelajari di: http://achmatim.net/2012/04/11/fungsi-group-by-dan-having-untuk-pengelompokkan-data-di-mysql/
Untuk yg kedua bisa pake kondisi biasa:
SELECT * FROM tabel WHERE tanggal=’YYYY-MM-DD’
Salam
saya mau bertanya pak…kalo kita lupa nama trigernya apa, untuk cara menghapusnya bagaimana, apakah trigger tersebut bisa di edit atau dilihat?
trimakasih mohon jawabannya
salam fadly
tampilkan trigger dengan perintah “SHOW TRIGGERS”, lalu untuk menghapusnya pake DROP, lihat contoh di tutorial di atas.