Thursday, February 5, 2009

Membuat Trigger

salah satu feature yang terdapat di mysql versi 5.x.x adalah trigger, bila di artikan ke bahasa indonesia adalah pemicu. Bila di artikan sesuai dengan namanya trigger memang ada kaitannya dengan picu-memicu (itu istilah gw aja).

kayaknya akan lebih mudah di mengerti bila langsung di bawa ke contoh kasus begini bro.........

misalkan ada sebuah database yang didalamnya terdapat tabel untuk mencatat transaksi penjualan barang harian dan rekapitulasi pejualan barang bulanan.

jadi ketika terjadi perubahan data (insert, update, delete) pada tabel transaksi harian secara otomatis akan update ke tabel transaksi rekapitulasi barang bulanan.

jadi plan nya begini, bikin dua tabel, pertama untuk menyimpan transaksi harian, dan yang kedua bikin tabel untuk menyimpan rekapitulasi transaksi bulannya. di bawah ini struktur tabel nya :

1. tabel tbl_penjualan untuk menyimpan transaksi penjualan harian

CREATE TABLE `tbl_penjualan` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`kode_barang` char(10) NOT NULL,
`tgl_transaksi` datetime NOT NULL,
`jml` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=latin1 COMMENT='tabel yang mencatat penjualan tiap hari'


2. tabel tbl_pejualan_rekap_bulanan untuk menyimpan rekap pejualan bulanan

CREATE TABLE `tbl_penjualan_rekap_bulanan` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`kode_barang` char(10) NOT NULL,
`tgl_transaksi` char(10) NOT NULL,
`jml` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `bulankode` (`tgl_transaksi`,`kode_barang`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 COMMENT='tabel yang rekap penjualan harian'


oke ....tabel sudah terbuat !!!,

selanjutnya kita bikin trigger untuk insert data, jadi dengan trigger ini ketika ada penambahan data di tabel tbl_penjualan, secara otomatis di tabel tbl_pejualan_rekap_bulanan akan terjadi update data (data yang di update adalah field jml), tetapi bila datanya belum ada maka akan bikin membuat row/baris/record baru.

CREATE TRIGGER `rekap_bulan` AFTER INSERT ON `tbl_penjualan` FOR EACH ROW
BEGIN
INSERT INTO `tbl_penjualan_rekap_bulanan` SET
`kode_barang`=NEW.`kode_barang`,
`tgl_transaksi`=date_format(NEW.`tgl_transaksi`,'%Y%m'),
`jml`=NEW.`jml`
ON DUPLICATE KEY UPDATE `jml`=`jml`+NEW.`jml`;
END


sekarang kita coba insert data ke tabel tbl_penjualan.

insert into tbl_penjualan values (null,'0000000001',now(),20);
insert into tbl_penjualan values (null,'0000000001',now(),30);
insert into tbl_penjualan values (null,'0000000001',now(),10);
insert into tbl_penjualan values (null,'0000000002',now(),5);
insert into tbl_penjualan values (null,'0000000002',now(),7);


jadi kurang lebih kalau liat isi tabelnya jadi begini :

mysql> select * from tbl_penjualan
-> ;
+----+-------------+---------------------+-----+
| id | kode_barang | tgl_transaksi | jml |
+----+-------------+---------------------+-----+
| 5 | 0000000001 | 2009-02-05 15:10:50 | 20 |
| 6 | 0000000001 | 2009-02-05 15:14:01 | 30 |
| 7 | 0000000001 | 2009-02-05 15:14:32 | 10 |
| 8 | 0000000002 | 2009-02-05 15:15:26 | 5 |
| 9 | 0000000002 | 2009-02-05 15:15:35 | 7 |
+----+-------------+---------------------+-----+
5 rows in set (0.00 sec)

mysql> select * from tbl_penjualan_rekap_bulanan;
+----+-------------+---------------+-----+
| id | kode_barang | tgl_transaksi | jml |
+----+-------------+---------------+-----+
| 2 | 0000000001 | 200902 | 60 |
| 3 | 0000000002 | 200902 | 12 |
+----+-------------+---------------+-----
+

selanjutnya kita bikin trigger untuk update data, jadi dengan trigger ini ketika ada perubahan data di tabel tbl_penjualan, secara otomatis di tabel tbl_pejualan_rekap_bulanan akan terjadi update data (data yang di update adalah field jml)

CREATE TRIGGER `rekap_bulan_update` AFTER UPDATE ON `tbl_penjualan` FOR EACH ROW
BEGIN
UPDATE `tbl_penjualan_rekap_bulanan`
SET `jml` = `jml` + NEW.jml - OLD.jml
WHERE
`kode_barang` = NEW.`kode_barang` AND
`tgl_transaksi` = date_format(NEW.`tgl_transaksi`,'%Y%m');
END;



selanjutnya kita bikin trigger untuk delete data, jadi dengan trigger ini ketika ada data yang dihapus di tabel tbl_penjualan, secara otomatis di tabel tbl_pejualan_rekap_bulanan akan terjadi update data (data yang di update adalah field jml)

CREATE TRIGGER `rekap_bulan_delete` AFTER DELETE ON `tbl_penjualan` FOR EACH ROW
BEGIN
UPDATE `tbl_penjualan_rekap_bulanan`
SET `jml` = `jml` - OLD.jml
WHERE
`kode_barang` = OLD.`kode_barang` AND
`tgl_transaksi` = date_format(OLD.`tgl_transaksi`,'%Y%m');
END;



tambahan aja kalau pengen liat trigger2 yang udah di buat gimana caranya,

mysql> select trigger_name from information_schema.triggers;
+--------------------+
| trigger_name |
+--------------------+
| rekap_bulan |
| rekap_bulan_update |
| rekap_bulan_delete |
+--------------------+



nb: versi database di sample ini pake mysql versi 5.1.22

18 comments:

  1. Wah, tutorial yang sangat membantu. Namun saya mendapatkan sedikit masalah. Sewaktu syntax trigger untuk update saya eksekusi, respon nya sangat lama dan akhirnya muncul tulisan berikut :

    "Fatal error: Maximum execution time of 300 seconds exceeded in /usr/share/phpmyadmin/libraries/import/sql.php on line 113"

    Apakah ada syntax yang salah? Mohon bantuannya.

    ReplyDelete
  2. ekseksui querynya pake phpmyadmin ya gan... ???

    klw iya....
    coba di check max ekesusi time php (php.ini) nya....

    klw mau test triger eksekusi query nya di console mysql nya aja.

    ReplyDelete
  3. mohon bantuannya gmn klo di coba di php my admin...

    ReplyDelete
  4. Gimana Kalo kejadianya saya ada tabel pegawai, terdiri dari nip,nama,kelamin dan id unit

    terus tabel kedua yang akan diupdate langsung cuman ada field id_unit,jumlah_laki,jumlah_perempuan

    saya inginya begitu insert tabel pertama entah itu kelaminya L/P akan dihitung dan dimasukkan ke tabel kedua

    ReplyDelete
  5. @obinote pake phpmyadmin pun tetap bisa bisa... tuliskan saja sintak CREATE TRIGGER di EDITOR SQL phpmyadmin.

    ReplyDelete
    Replies
    1. #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 7

      gmna ini error ?

      Delete
  6. This comment has been removed by the author.

    ReplyDelete
  7. @wika untuk keperluan itu sepertinya bisa di kombinasikan dengan pemanggilan store procedure didalam triger. pada store procedure tersebut berisikan sintak untuk menghitung jumlah pria dan wanita. kemudian trigger sebagai pemicu dalam menjalankan store procedure teresebut. seperti contoh ini.

    CREATE TRIGGER `tbl_satu_insert` AFTER INSERT ON `tbl_satu` FOR EACH ROW
    BEGIN
    CALL sp_hitung_kelamin();
    END;

    ReplyDelete
  8. makasih tutornya mas...
    ini yang masih tak cari...
    mantabs penjelasannya heheheheh
    http://uut.six.or.id/

    ReplyDelete
  9. gan bisa gak trigger-nya buat insert di host lain?

    ReplyDelete
  10. kla insertnya ke database yang berada di host berbeda sepertinya ngak bisa gan...

    ReplyDelete
  11. saya mau nanya, gimana ya buat triiger pada 1 tabel.
    contohnya gini, saya mau insert data pada 1 tabel tapi yang di insert cuma 1 row saja.
    trus trigger ini yang menangani insert ke row yang lain.
    jadi 1 row kita insert maka row yang lain juga otomatis terisi...

    Thanks sebelumnya...

    ReplyDelete
  12. Bos, kalo saya pingin triger tapi jika id_user = 001, jika selain 001, maka triger tidak berlaku, caranya gmana ya... mhn jawaban jika berkenan di email ke maarifwsb@yahoo.com, matur suwun

    ReplyDelete
  13. trims broh.. berguna bgt buat sistem yang lagi ane bikin

    ReplyDelete