CREATE TRIGGER MySQL


Trigger adalah sebuah Script MySQL Command yang memicu suatu kejadian dalam database MySQL berupa aksi insert, update dan delete setelah syarat tertentu. Lokasi penulisan Trigger adalah di dalam database yang bersangkutan, dan Trigger tidak ditempatkan di php script. Hasil penulisan dari sebuah Trigger akan menimbulkan efek manipulasi database secara otomatis sesuai dengan yang kita inginkan. Misalnya, setelah insert pada tabel_a dan kolom a1 maka akan otomatis insert pada tabel_b pada kolom b1. Begitu pula untuk aksi update dan delete. Untuk pembuatan Trigger ini saya menggunakan Appserv 2.5.10, MySQL Version 5.0.24a, browser mozilla Firefox dengan sistem operasi Windows7 Ultimate.

Trigger merupakan script MySQL Command yang terdiri dari 3 pokok dasar yaitu, insert, update dan delete. Adapun langkah-langkah membuat Trigger adalah :

1. Buat database dulu dengan script :  create databaset ‘tes';

2. Buat tabel beli :

 CREATE TABLE beli
(id_beli int(11) NOT NULL AUTO_INCREMENT
, kd_barang varchar(10)  default NULL
, satuan double default NULL
, jumlah int(11) default NULL
, total double default NULL
, status varchar(30) default NULL
, PRIMARY  KEY (id_beli)
) ENGINE = MYISAM DEFAULT CHARSET = utf8; 

3.  Buat tabel Jual :

 CREATE  TABLE jual
(id_jual int(11)  NOT  NULL AUTO_INCREMENT
, kd_client varchar(10)  NOT  NULL
, kd_barang varchar(10)  default NULL
, satuan int(5)  default NULL
, jumlah double  default NULL ,
 total double  default NULL ,
 status varbinary(25)  default NULL ,
 PRIMARY  KEY (id_jual)
) ENGINE  =  MYISAM  DEFAULT CHARSET  =  utf8; 

4. Buat tabel stok :

CREATE  TABLE stok
(kd_barang varchar(5) NOT  NULL
, jumlah int(11) NOT NULL
, PRIMARY KEY (kd_barang)
) ENGINE = MYISAM  DEFAULT CHARSET = utf8; 

Nah, anda sudah memiliki tabel beli, jual dan stok. Skenarionya adalah jika ada pembelian, akan otomatis menambah stok barang, dan jika ada penjualan akan mengurangi stok barang secara otomatis.

Perhatikan tanda $$ tersebut harus dikonfigurasikan seperti gambar berikut :

Penulisan Trigger

Penulisan Trigger

Artinya, anda harus menambahkan tanda $$ karena itu merupakan delimiter yang membatasi akhir dari sebuah Trigger

1. Membuat Trigger beli_barang

CREATE TRIGGER beli_barang after INSERT ON beli
 FOR EACH ROW BEGIN
 INSERT INTO stok SET
 kd_barang = NEW.kd_barang
 , jumlah=New.jumlah
 ON DUPLICATE KEY UPDATE jumlah=jumlah+New.jumlah;
 END$$ 

Keterangan : Trigger dibuat dengan nama ‘beli_barang’ dan bekerja setelah insert data pada tabel beli, maka akan insert juga pada tabel stok dengan mengisi field pada tabel stok berupa kd_barang dan jumlah sama persis yang di insert di tabel beli.  Dan Metode updatenya adalah jumlah yang ada ditambah dengan jumlah baru yang di insert kan di tabel beli. Jika awal insert otomatis tidak ada penjumlahan, karena logika nya jumlah barang yang ada di tabel stok adalah nol.

On Duplicate Key Update artinya : jika ada insert data di tabel beli dengan kode barang  (kd_barang) yang sama, maka akan otomatis menambah jumlah nya di tabel stok dengan kd_barang yang dimaksud. Akan saya jelaskan lebih rinci dengan gambar :

Isi Tabel Yang diberi Trigger

Isi Tabel Yang diberi Trigger

2. Membuat Trigger jual_barang

CREATE TRIGGER jual_barang after INSERT ON jual
 FOR EACH ROW BEGIN
 UPDATE stok
 SET jumlah = jumlah - NEW.jumlah
 WHERE
 kd_barang = NEW.kd_barang;
 END$$ 

Keterangan : Trigger dibuat dengan nama ‘jual_barang’ setelah insert pada tabel jual maka pada setiap barisnya akan di update dimana kode barang (kd_barang) nya sama dengan yang ada di tabel stok (stok). Hasilnya adalah jika ada penjualan barang pada tabel jual (jual), maka akan otomatis mengurai jumlah barang pada stok (stok), dimana kode barang yang dimaksud (kd_barang) sama dengan yang diisi di tabel jual (jual).

Kesimpulannya, salah satu manfaat Trigger adalah membantu administrasi database dengan teknik memanipulasi data sesuai dengan yang dibutuhkan.

81 comments on “CREATE TRIGGER MySQL

    • tidak ada pak.. yang penting langkahnya benar,, triger kaitannya dengan mysql,, version yang support adalah 5.xxx ke atas.. bisa juga menggunakan mysql yog

  1. ehm leh tanya g mas…

    aq punya masalah ne,,,

    bisa g create table / field dalam table secara otomatis apabila terjadi penambahan dari admin,…

    thanx ya..

    reply ya kk….
    matur suwon,,,,

    • pengalamanku menggunakan trigger, waktu bikin sms gateway..
      agak2 lupa, kalo gak salah tuuu:
      jangan lupa set delimiter dulu pada prompt mysqlnya,
      mysql> delimiter //
      setelah itu berikan perintah:
      mysql> CREATE TRIGGER table1 BEFORE INSERT ON table2
      -> FOR EACH ROW
      -> BEGIN
      -> IF NEW.nilai SET NEW.terbilang=baik;
      -> ELSEIF NEW.Salary>70 THEN
      -> SET NEW.terbilang=sangat baik;
      -> END IF;
      -> END
      -> delimitter ;

      intinya kita bisa melakukan update, delete, insert data pada table mysql menggunakan trigger.
      awalnya saya bingung, mengikuti forum dan browsing ke luar negeri pun akhirnya menemukan jalan..
      aku banyak belajar di http://www.roseindia.net/mysql/mysql5/triggers.shtml
      selamat mencoba,
      terima kasih buat penulisnya..
      salam,
      mapays

    • trigger adalah konsepnya memicu sebuah kejadian atas kejadian lain baik sebelum dan sesudahnya. maksudnya gmana nih mas dede.. biar lebih rinci deh,, mungkin akan ada solusinya,,

    • AFAIK, Trigger pada MySQL hanya akan memicu fungsi/query DML(Data Manipulation Language) yaitu INSERT, UPDATE, DELETE, SELECT.

  2. pak tanya lagi ki, setiap tabel kan hanya mampu menampung 1 triger, lha padahal kita butuh 3 event triger. insert, update, delete. nah kira2 gimana tu skripnya. menindak lanjuti contoh yg diatas saja pak? terimakasih

    • gni lho pak, kemaren kan saya knsultasi sama dosen, kalo triger itu tidak bisa ada lebih dari satu i setiap tabel nya. nah tapi satu triger itu bisa memuat 3 event sekaligus, yaitu insert, update sama delete. klo seperti itu skripnya seperti apa, gt? masih seputar stok barang, sepeerti contoh diatas. misal di tabel pembelian, contohnya kan di buat trigger pembelian dengan event insert, nah sekarang dmn kalo evennya ada insert, update sama delete! terimakasih

      • bisa pak.. dalam satu tabel bisa lebih dari 1 trigger,, caranya dengan before insert dan after insert.. namun hati2 jangan sampai membuat trigger dengan statemen rancu.. intinya logikanya harus jalan dl.. sya pake 2 trigger dalam 1 tabel. :D

  3. untuk lebih detailnya silahkan kasusnya dikirim ke email saya, nanti saya bantu analisis, trigger merupakan salah satu pemicu saja.. mungkin bisa pake store procedure, atau langsung menggunakan script php sendiri yang membuat query pada saat bersamaan. Begitu pak bhaktiardi..

  4. 1.ada gambaran gak untuk penerapan trigger di database untuk aplikasi Sistem Informasi Akademik?
    2.apakah bisa dilakukan trigger untuk databas yang berbeda dan pada server yang berbeda?

    terima kasih

      • konsep dasar trigger udh tau mas tapi saya ingin membuat trigger sebagai proses backup data secara rutin. Gambaran umumnya seperti ini:
        sistem informasi akademik mempunyai 1 database induk yang menampung semua data2 mahasiswa.aplikasi ini digunakan oleh mahasiswa untuk menginput mata kuliah dan administrasi lainnya.

        Yang ingin saya rancang adalah:
        1. membuat 1 database cadangan / duplikat dari database induk.
        2. trigger ingin saya gunakan sebagai proses backup data dari database induk.
        3. setiap ada proses insert,update dan delete di database induk maka tabel di database backup juga ikut terupdate.
        4. bisa dibilang replikasi data tetapi secara rutin untuk setiap proses.

        Yang ingin saya tanyakan:
        1. kira2 konsep sistem atau triggernya gmna mas?
        2. apakah trigger bisa diterapkan untuk server yang berbeda,contoh: database induk di 127.0.0.1 dan database backup 127.0.0.2 (MySQL)

        Terima kasih

    • untuk proses backupdata secara rutin biasanya saya bikin mysql dump untuk scheduler backup.. atau menggunakan software khusus seperti mysql gui atau kettle.

  5. kalo misalnya ada ada 3 tabel dimana saya mau menjumlahkan total biaya pada ketiga tabel tersebut
    di tabel pertama ada kolom tempat dengan isi data “A”, di tabel kedua pun pada kolom tempat data yang ada pada tabel pertama tetap “A”, namun pada tabel ke tiga terjadi perubahan tempat, dimana barang pada tempat “A” di pindah pada Tempat “C” nah pada saat seperti ini gimana caranya buat trigger kalo terjadi perubahan tempat??apa komputer tetap membaca tempat A sebagai tempat C??

    tolong di balas yahhh,,butuh banget nih,,terima kasih

  6. salam kenal pak budi, mengenai triggers yang bapak buat contoh untuk triggers dengan script ini tidak bisa di create ke mysql.
    =================================
    CREATE TRIGGER jual_barang after INSERT ON jual
    FOR EACH ROW BEGIN
    UPDATE stok
    SET jumlah = jumlah – NEW.jumlah
    WHERE
    kd_barang = NEW.kd_barang;
    END$$
    =================================
    terjadi kesalahan

    SQL Error: 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 ‘END$$’ at line 1

    =================================
    mohon dikoreksi dan dibalas script mana yang salah ?

    terima kasih, salam.

  7. pak.. limitter editor di bawah silahkan diberi tanda $$
    karena itu merupakan batas sebuah script trigger.. saya sudah mencoba dan berhasil, silahkan dikoreksi kembali pak

    • saya sudah mencoba ternyata berhasil, trima kasih atas saran dari bapak. saya sedang latihan database, mohon bantuannya jika saya membutuhkan nantinya pak. salam

  8. makasih pak,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

  9. asslm.salam indonesia
    pak saya mau tanya, kan saya udah Membuat Trigger jual_barang
    ternyata berhasil di mysqlnya,,tetepi ketika di insert tabel barangnya ternyata error

    MySQL said: ?
    #1054 – Unknown column ‘jumlah–NEW.jumlah’ in ‘field list’
    maksunya kenapa.
    muhon bantuanya

    Trima Kasih

    • tabel sudah dibuat belum pak??yang saya sertakan di atas triger saya?? artinya disitu ada warning : #1054 – Unknown column ‘j’ in ‘field list’

      artinya kesalahan ada di kata : umlah–NEW.jumlah

  10. nubi ikutan nanya pak :D
    kalau mau bikin trigger secara terjadwal dan terus menerus bagaimana syntaknya?

    misalkan ada 2 tabel A (nama_barang dan waktu) dan tabel B (id, nama_barang)
    mau saya jika ‘waktu’ di tabel A = sekarang, kemudian otomatis isi tabel A di insert ke tabel B

    bisa tidak kasus tersebut diselesaikan pake mysql trigger?
    kalau tidak bisa, ada solusi lain?

    terimakasih sebelumnya pak :)

  11. Sy mau tanya nih mas, trigger itu bersifat temporary dalam artia harus slalu dibuat atau cukup 1 kali buat saja? Trims atas infonya…

    • trigger itu adalah sebuah script yang memerintahkan melakukan reaksi atas aksi tertentu terhadap database (after dan before)

  12. Untuk Back Up Database saya menggunakan mysqldump pada saat di database saya backup, triggernya gak ikut ke backup gimana cara supaya trigger dan function bisa ikutan terbackup

  13. agan budi tq sekali sangat berguna infonya…
    kalo bisa dalam format PDF atau word ya om, pasti nanti saya langsung download deh…
    hehehhe
    tq om

  14. Gan mohon bantuannya..
    seperti kasus yg diatas,,saya mau membuat 2 trigger pada satu tabel..trigger pertama utk update di tabel stok dan trigger kedua maunya untuk insert tbel penjualan…nah 2 trigger itu aktif jika ada insert di tabel detail_penjualan.
    kalo seperti itu,,gmn yg Gan triggernya?
    apa harus pake store procedure gitu?
    sebelumnya,,terimakasih utk bantuannya..

  15. gan mohon bantuannya
    sy masih bingung mengenai triggger…
    sy send via e-mail kasusnya ..?

    sebelum dan sesudahnya trimakasih

  16. pa… saya butuh bantuan.
    ada masalah di update stock jg.
    saya lg tugas akhir…
    kalo kasus diatas kan ditabel beli sama jualnya ada kode_barang..
    kalo saya adanya id_barang, sedangkan id_barang adalah auto_inceremet

    • secara singkatnya, trigger itu bekerja apabila ada aksi tertentu, bisa sebelum aksi tersebut/sesudah aksi tersebut, apa yang akan diperintahkan, apabila masih bingung, boleh masil saya

  17. salam kenal …mau tanya dong
    emang bisa yah bikin 2 trigger di satu database semisal Trigger beli_barang dan jual
    soalnya waktu saya buat sms gateway pake trigger dia ngak bisa 2 trigger , apa karna phpmyadmin nya ngak support …mohon pencerahan nya

    • emang trigger beli_barang dan jual sama2 dalam satu tabel y?
      kalo trigger beli_barang diletakan di tabel pembelian, kalo trigger jual diletakkan di tabel penjualan. baru bisa jalan ^^. Setau saya kalo langsung 2 trigger bisa, tp tidak bisa sama fungsinya jd ga bs sama2 buat delete/insert/update. Maaf kalo ga ngerti……

  18. newbi masuk,,

    Pak mau tanya ,,

    kalau misal row tabel jual di delete terus stok kembali lagi gimana ya pa

    • berarti kalau row tabel jual di delete, buat trigger after delete,, supaya memerintahkan mendelete jg stok yg ada di tabel lainnya/backup

  19. misi pak,,mau nanya..ini kan script untuk 1 transaksi membeli 1 kode barang,,,nah kalo 1 transaksi membeli beberapa kode barang gmn pak ?

  20. Pak saya mau nanya.. Jika ketika kita save data maka langsung muncul data yg kita save tersebut. Skriptnya gimna..? Contohnya misalkan kita booking kaar dihotel online kemudian ketika kita save or submit langsung keluar data yg kita save…tapi hanya data yg kita save tadi bukan semua data yg sebelumnya kita save itu gimna skripnya.

    • semacam popup/page pak?itu bukan trigger itu pak, script php biasa, dimodifikasi saja, setelah simpan, action nya dialihkan ke halaman yang kita inginkan, trus yg diquery tidak semuanya,, beberapa data saja yang diperlukan

  21. pak,mau tanya kalau mau buat trigger untuk keperluan puskesmas…bagian kuota ruangan gmn pak???
    saat diisi tanggal masuk,maka kuota ruangan berkurang.
    jika tgl keluar diisi maka kuota ruangan bertambah.
    tabelnya
    rawat_inap : kode_pasien,tgl_masuk,tgl_keluar,kode_ruangan
    ruangan : kode_ruangan,kuota

    CREATE TRIGGER inap BEFORE INSERT OR UPDATE OF kode_ruangan ON rawat_inap
    FOR EACH ROW
    BEGIN
    IF INSERTING THEN
    UPDATE ruangan SET kuota = kuota – 1 WHERE kode_ruangan = :new.kode_ruangan;
    ELSIF UPDATING THEN
    IF :new.kode_ruangan = :old.kode_ruangan THEN
    UPDATE ruangan SET kuota = kuota + 1 WHERE kode_ruangan = :new.kode_ruangan;
    ELSE
    UPDATE ruangan SET kuota = kuota + 1 WHERE kode_ruangan = :old.kode_ruangan;
    UPDATE ruangan SET kuota = kuota – 1 WHERE kode_ruangan = :new.kode_ruangan;
    END IF;
    END IF;
    END;

    mohon solusinya pak..terima kasih

  22. pak,mau tanya kalau mau buat trigger untuk keperluan puskesmas…bagian kuota ruangan gmn pak???
    saat diisi tanggal masuk,maka kuota ruangan berkurang.
    jika tgl keluar diisi maka kuota ruangan bertambah.
    tabelnya
    rawat_inap : kode_pasien,tgl_masuk,tgl_keluar,kode_ruangan
    ruangan : kode_ruangan,kuota
    tabelnya
    rawat_inap : kode_pasien,tgl_masuk,tgl_keluar,kode_ruangan
    ruangan : kode_ruangan,kuota

    CREATE TRIGGER inap BEFORE INSERT OR UPDATE OF kode_ruangan ON rawat_inap
    FOR EACH ROW
    BEGIN
    IF INSERTING THEN
    UPDATE ruangan SET kuota = kuota – 1 WHERE kode_ruangan = :new.kode_ruangan;
    ELSIF UPDATING THEN
    IF :new.kode_ruangan = : old.kode_ruangan THEN
    UPDATE ruangan SET kuota = kuota + 1 WHERE kode_ruangan = :new.kode_ruangan;
    ELSE
    UPDATE ruangan SET kuota = kuota + 1 WHERE kode_ruangan = : old.kode_ruangan;
    UPDATE ruangan SET kuota = kuota – 1 WHERE kode_ruangan = :new.kode_ruangan;
    END IF;
    END IF;
    END;

    mohon solusinya pak

  23. 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?

    • itu data di .txt yang mau sy masukan ke database, hanya saja output yang diminta nantinya seperti diatas tadi:
      “yang diinginkan 1: jumlah pengguna masing-masing os”
      “yang diinginkan 2: detail data per tanggal (misal per data masuk )”

      nah, bagaimana desain database-nya,…apakah juga perlu digunakan teknik triger?

  24. Selamat pagi pak, saya mau tanya apakah teknik ini bisa diterapkan disemua jenis engine mysql (MyISAM/InnoDB)?

    terima kasih.
    salam.

  25. Mohon solusinya pak,
    saya punya 2 tabel,
    1. tabel_keg: id, kode, nm_kode, jml_pagu,jml_uang,sisa_uang.
    2. keg: id,kode,jml_uang.
    1!551!1000!
    2!552!2000!
    3!551!1000!

    bisakah menggunakan trigger jika jml_uang pada tabel 1, merupakan jumlah uang pada tabel 1 sesusai kode_keg? sehingga menghasilkan tabel 1 menjadi:
    1. tabel_keg: id, kode, nm_kode, jml_pagu,jml_uang,sisa_uang.
    1!551!barang1!10000!2000!8000!
    2!552!barang2!11000!2000!9000!
    Terima kasih banyak..

  26. mas, nubie, mw tany, misalkan ada kasus update data antar database, dari sistem yang beda pula, apa bisa pake trigger?, misalkan ada sistem informasi barang dari perusahaan A dan Distributor B, distributor B menginginkan update tabel barang sistem A memicu trigger dan mengupdate tabel barang pada sistem B.. apakah bisa yg seperti itu,.. mohon bantuanny..

  27. mas, saya mau tanya punya script ( php ) buat ngurangi dan nambah stok buku otomatis gak, jadi pas tampil itu kelihatan ketersediaan bukunya,
    saya kan mempersiapkan buat sistem perpustakaan online ,
    terimakasih , sebelumnya,,,

  28. thx banget infonya kk, saya sama sekali gelap tentang it tp saya lagi belajar secara otodidak, nah sekrg saat ini saya mau buat stok barang sesuai yg kk jlaskan ada table beli, jual, stok kalau da table returan barang dimana barang retur ada yang baik dan masih bisa masuk ke stok barang dan dijual kembali dan ada barang yang di retur tidak dapat dijual kembali kira” solusinya gimana ea kk kl tidak merepotkan
    terima kasih

  29. Gan mau nanya ni… gmna seandainya kalau barang sudah nol (0) atau habis dam masih melakukan penjualan pasti jumlah barang jadi minus. Tolong pencerahannya.

  30. mksih sblm ny atas info ny
    tpi saat sy coba eror gan,
    pesan ny sprti ini : Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 39523325 bytes) in C:\wamp\apps\phpmyadmin3.2.0.1\libraries\import.lib.php on line 98,
    tlong bntuan ny gan trima ksih

  31. mas gmna caranya membatasi agar jumlah stok tidak jdi minus dari hasil pengurangannya ??

    mhon di bantu

  32. bisa bantu tgas ini gak mz ?
    Database TamanBacaan
    Catatan : Saat terjadi peminjaman, insert peminjaman dilakukan tanpa mengisi kolom tglkembali atau tglkembali diisi null, saat buku dikembalikan maka dilakukan update tglkembali dengan mengisikan tanggal system (dengan asumsi semua buku yang dipinjam dikembalikan)
    • Trigger untuk mengubah status buku menjadi ‘K’ saat terjadi peminjaman atas buku tersebut (saat diinsert kolom tglkembali dan denda dikosongkan)
    • Trigger untuk mengubah status buku menjadi ‘A’, saat terjadi perubahan data peminjaman yaitu kolom TglKembali tidak null,

Berikan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Logout / Ubah )

Twitter picture

You are commenting using your Twitter account. Logout / Ubah )

Facebook photo

You are commenting using your Facebook account. Logout / Ubah )

Google+ photo

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s