Pendahuluan
Pemicu MySQL menerapkan batasan pada tabel saat menambahkan, memperbarui, atau menghapus baris tabel.
Kolom di MySQL menerapkan sedikit batasan nilai. Misalnya, menyetel tipe data kolom sebagai tiny int dan bukan nol membutuhkan masukan nilai bilangan kecil. Namun, lebih banyak batasan diperlukan untuk menjaga integritas data.
Tutorial ini menunjukkan cara menggunakan pemicu MySQL dan memberikan contoh untuk setiap jenis pemicu.
Prasyarat
- Sistem yang menjalankan MySQL pada server database
- Akun pengguna MySQL dengan hak akses root
- Pengetahuan tentang perintah dasar MySQL (lihat lembar contekan perintah MySQL yang dapat diunduh)
Apa yang dimaksud dengan Pemicu di MySQL?
Pemicu adalah objek MySQL bernama yang aktif ketika suatu peristiwa terjadi dalam tabel. Pemicu adalah jenis prosedur tersimpan tertentu yang terkait dengan tabel tertentu.
Pemicu memungkinkan akses ke nilai dari tabel untuk tujuan perbandingan menggunakan NEW
dan OLD
. Ketersediaan pengubah bergantung pada peristiwa pemicu yang Anda gunakan:
Peristiwa Pemicu | TUA | BARU |
MASUKKAN | Tidak | Ya |
PERBARUI | Ya | Ya |
HAPUS | Ya | Tidak |
Memeriksa atau mengubah nilai saat mencoba memasukkan data akan membuat NEW.<column name>
pengubah tersedia. Ini karena tabel diperbarui dengan konten baru. Sebaliknya, sebuah OLD.<column name>
value tidak ada untuk pernyataan insert karena tidak ada informasi yang ada di tempatnya sebelumnya.
Saat memperbarui baris tabel, kedua pengubah tersedia. Ada OLD.<colum name>
data yang ingin kami perbarui ke NEW.<column name>
data.
Terakhir, saat menghapus baris data, OLD.<column name>
pengubah mengakses nilai yang dihapus. NEW.<column name>
tidak ada karena tidak ada yang menggantikan nilai lama setelah dihapus.
Contoh Pemicu MySQL
Sebagai contoh pemicu yang diterapkan, memasukkan nilai baru ke dalam tabel orang menghasilkan hasil yang berbeda dari input asli:
Perhatikan nama yang dimasukkan awalnya huruf kecil. Saat memilih tabel, huruf pertama ditampilkan sebagai huruf besar. Meskipun tidak ada indikasi yang berbeda dari pernyataan penyisipan biasa, pemicu diaktifkan sebelum pernyataan penyisipan untuk menggunakan huruf kapital pada huruf pertama dari nama tersebut.
Menggunakan Pemicu MySQL
Setiap pemicu yang terkait dengan tabel memiliki nama dan fungsi unik berdasarkan dua faktor:
1. Waktu . BEFORE
atau AFTER
peristiwa baris tertentu.
2. Acara . INSERT
, UPDATE
atau DELETE
.
MySQL memicu kebakaran tergantung pada waktu aktivasi dan peristiwa untuk total enam kombinasi pemicu unik. Pernyataan sebelum membantu untuk memeriksa data dan membuat perubahan sebelum membuat komitmen, sedangkan pernyataan setelah mengkomit data terlebih dahulu dan kemudian mengeksekusi pernyataan.
Eksekusi serangkaian tindakan terjadi secara otomatis, memengaruhi semua baris yang dimasukkan, dihapus, atau diperbarui dalam pernyataan.
Buat Pemicu
Gunakan CREATE TRIGGER
sintaks pernyataan untuk membuat pemicu baru:
CREATE TRIGGER <trigger name> <trigger time > <trigger event>
ON <table name>
FOR EACH ROW
<trigger body>;
Praktik terbaik adalah memberi nama pemicu dengan informasi berikut:
<trigger time>_<table name>_<trigger event>
Misalnya, jika pemicu diaktifkan sebelum menyisipkan di atas meja bernama karyawan , konvensi terbaik adalah memanggil pemicu:
before_employee_insert
Atau, praktik umum adalah menggunakan format berikut:
<table name>_<first letter of trigger time><first letter of trigger name>
sebelum menyisipkan nama pemicu untuk tabel karyawan terlihat seperti ini:
employee_bi
Pemicu dijalankan pada waktu tertentu dari suatu peristiwa di tabel yang ditentukan oleh
Untuk menghapus pemicu, gunakan
Atau, gunakan:
Pesan kesalahan tidak ditampilkan karena tidak ada pemicu, jadi tidak ada peringatan yang dicetak.
Buat database untuk kode contoh pemicu dengan struktur berikut:
1. Buat tabel bernama orang dengan nama dan usia untuk kolom.
Masukkan data sampel ke dalam tabel:
Pilih tabel untuk melihat hasilnya:
2. Buat tabel bernama usia_rata-rata dengan kolom bernama rata-rata :
Masukkan nilai usia rata-rata ke dalam tabel:
Pilih tabel untuk melihat hasilnya:
3. Buat tabel bernama person_archive dengan nama , usia , dan waktu kolom:
Untuk membuat
SEBELUM MASUKKAN Contoh Pemicu
Buat
Memasukkan data mengaktifkan pemicu dan memeriksa nilai usia sebelum melakukan informasi:
Konsol menampilkan pesan kesalahan deskriptif. Data tidak dimasukkan ke dalam tabel karena pemeriksaan pemicu gagal.
Buat
SETELAH MASUKKAN Contoh Pemicu
Menyisipkan baris baru ke dalam orang tabel tidak secara otomatis memperbarui rata-rata dalam usia_rata-rata meja. Buat
Menyisipkan baris baru ke dalam orang tabel mengaktifkan pemicu:
Data berhasil dikomit ke orang tabel dan memperbarui usia_rata-rata tabel dengan nilai rata-rata yang benar.
Buat
SEBELUM MEMPERBARUI Contoh Pemicu
Jika ada batasan usia untuk orang tabel sebelum memasukkan data, batasan usia juga harus ada sebelum memperbarui informasi. Tanpa
Tambahkan
Memperbarui nilai yang ada akan mengaktifkan pemeriksaan pemicu:
Memperbarui usia ke nilai kurang dari 18 menampilkan pesan kesalahan, dan informasi tidak diperbarui.
Gunakan blok kode berikut untuk membuat
SETELAH PEMBARUAN Contoh Pemicu
Setiap pembaruan yang berhasil untuk usia data dalam tabel orang juga harus memperbarui nilai rata-rata menengah yang dihitung dalam usia_rata-rata tabel.
Buat
Memperbarui data yang ada akan mengubah nilai di orang tabel:
Memperbarui tabel orang juga memperbarui rata-rata dalam usia_rata-rata tabel.
Untuk membuat
SEBELUM MENGHAPUS Contoh Pemicu
Arsipkan data yang dihapus dengan membuat
Menghapus data dari tabel orang mengarsipkan data ke person_archive tabel sebelum menghapus:
Memasukkan nilai kembali ke orang table menyimpan log data yang dihapus di person_archive tabel:
Buat
SETELAH DELETE Contoh Pemicu
Buat
Menghapus catatan dari tabel orang memperbarui usia_rata-rata tabel dengan rata-rata baru:
Tanpa
MySQL tidak mendukung beberapa pemicu yang diaktifkan secara bersamaan. Namun, menambahkan beberapa operasi logis ke pemicu yang sama dimungkinkan. Gunakan
Pastikan untuk mengubah pembatas default sebelum membuat pemicu dengan beberapa operasi.
Buat daftar semua pemicu dalam database dengan:
Keluaran menunjukkan daftar semua pemicu, termasuk nama dan isi pernyataan:
Informasi lain juga ditampilkan, seperti waktu pembuatan dan pengguna yang membuat pemicu. untuk setiap baris yang dipengaruhi oleh fungsi.
Hapus Pemicu
DROP TRIGGER
pernyataan:DROP TRIGGER <trigger name>;
DROP TRIGGER IF EXISTS <trigger name>;
Buat Contoh Basis Data
CREATE TABLE person (name varchar(45), age int);
INSERT INTO person VALUES ('Matthew', 25), ('Mark', 20);
SELECT * FROM person;
CREATE TABLE average_age (average double);
INSERT INTO average_age SELECT AVG(age) FROM person;
SELECT * FROM average_age;
CREATE TABLE person_archive (
name varchar(45),
age int,
time timestamp DEFAULT NOW());
Buat Pemicu SEBELUM MASUKKAN
BEFORE INSERT
pemicu, gunakan:CREATE TRIGGER <trigger name> BEFORE INSERT
ON <table name>
FOR EACH ROW
<trigger body>;
BEFORE INSERT
trigger memberikan kontrol atas modifikasi data sebelum melakukan ke tabel database. Memanfaatkan nama untuk konsistensi, memeriksa panjang input, atau menangkap input yang salah dengan BEFORE INSERT
trigger lebih lanjut memberikan batasan nilai sebelum memasukkan data baru.BEFORE INSERT
pemicu untuk memeriksa nilai usia sebelum memasukkan data ke dalam orang tabel:delimiter //
CREATE TRIGGER person_bi BEFORE INSERT
ON person
FOR EACH ROW
IF NEW.age < 18 THEN
SIGNAL SQLSTATE '50001' SET MESSAGE_TEXT = 'Person must be older than 18.';
END IF; //
delimiter ;
INSERT INTO person VALUES ('John', 14);
Buat Pemicu AFTER INSERT
AFTER INSERT
pemicu dengan:CREATE TRIGGER <trigger name> AFTER INSERT
ON <table name>
FOR EACH ROW
<trigger body>;
AFTER INSERT
trigger berguna ketika baris yang dimasukkan menghasilkan nilai yang diperlukan untuk memperbarui tabel lain.AFTER INSERT
pemicu pada orang tabel untuk memperbarui usia_rata-rata tabel setelah disisipkan:delimiter //
CREATE TRIGGER person_ai AFTER INSERT
ON person
FOR EACH ROW
UPDATE average_age SET average = (SELECT AVG(age) FROM person); //
delimiter ;
INSERT INTO person VALUES ('John', 19);
Buat Pemicu SEBELUM UPDATE
BEFORE UPDATE
pemicu dengan:CREATE TRIGGER <trigger name> BEFORE UPDATE
ON <table name>
FOR EACH ROW
<trigger body>;
BEFORE UPDATE
pemicu berjalan bersama dengan BEFORE INSERT
pemicu. Jika ada batasan sebelum memasukkan data, batasan harus ada sebelum memperbarui juga.BEFORE UPDATE
pemicu, pemicu pemeriksaan usia mudah dihindari. Tidak ada yang membatasi pengeditan ke nilai yang salah.BEFORE UPDATE
pemicu ke orang tabel dengan isi yang sama dengan BEFORE INSERT
pemicu:delimiter //
CREATE TRIGGER person_bu BEFORE UPDATE
ON person
FOR EACH ROW
IF NEW.age < 18 THEN
SIGNAL SQLSTATE '50002' SET MESSAGE_TEXT = 'Person must be older than 18.';
END IF; //
delimiter ;
UPDATE person SET age = 17 WHERE name = 'John';
Buat Pemicu SETELAH UPDATE
AFTER UPDATE
pemicu:CREATE TRIGGER <trigger name> AFTER UPDATE
ON <table name>
FOR EACH ROW
<trigger body>;
AFTER UPDATE
pemicu membantu melacak perubahan yang dilakukan pada data. Paling sering, perubahan apa pun setelah memasukkan informasi juga terjadi setelah memperbarui data.AFTER UPDATE
pemicu untuk memperbarui usia_rata-rata tabel setelah memperbarui baris di orang tabel:delimiter //
CREATE TRIGGER person_au AFTER UPDATE
ON person
FOR EACH ROW
UPDATE average_age SET average = (SELECT AVG(age) FROM person); //
delimiter ;
UPDATE person SET age = 21 WHERE name = 'John';
Buat Pemicu SEBELUM DELETE
BEFORE DELETE
pemicu, gunakan:CREATE TRIGGER <trigger name> BEFORE DELETE
ON <table name>
FOR EACH ROW
<trigger body>;
BEFORE DELETE
pemicu sangat penting untuk alasan keamanan. Jika tabel induk memiliki anak yang dilampirkan, pemicu membantu memblokir penghapusan dan mencegah tabel yatim piatu. Pemicu juga memungkinkan pengarsipan data sebelum dihapus.BEFORE DELETE
pemicu di atas meja orang dan masukkan nilainya ke person_archive tabel:delimiter //
CREATE TRIGGER person_bd BEFORE DELETE
ON person
FOR EACH ROW
INSERT INTO person_archive (name, age)
VALUES (OLD.name, OLD.age); //
delimiter ;
DELETE FROM person WHERE name = 'John';
INSERT INTO person VALUES ('John', 21);
BEFORE DELETE
trigger berguna untuk mencatat setiap upaya perubahan tabel.Buat Pemicu SETELAH DELETE
AFTER DELETE
pemicu dengan:CREATE TRIGGER <trigger name> AFTER DELETE
ON <table name>
FOR EACH ROW
<trigger body>;
AFTER DELETE
pemicu mempertahankan pembaruan informasi yang mengharuskan baris data menghilang sebelum melakukan pembaruan.AFTER DELETE
pemicu di atas meja orang untuk memperbarui usia_rata-rata tabel dengan informasi baru:delimiter //
CREATE TRIGGER person_ad AFTER DELETE
ON person
FOR EACH ROW
UPDATE average_age SET average = (SELECT AVG(person.age) FROM person); //
delimiter ;
AFTER DELETE
pemicu, informasi tidak diperbarui secara otomatis.Buat Beberapa Pemicu
BEGIN
dan END
pembatas untuk menunjukkan badan pemicu:CREATE TRIGGER <trigger name> <trigger time > <trigger event>
ON <table name>
FOR EACH ROW
BEGIN
<trigger body>;
END;
Tampilkan Pemicu
SHOW triggers;