Rumah >pangkalan data >tutorial mysql >Pencetus MySQL Diterangkan dengan Contoh: Mengautomasikan Tindakan Pangkalan Data

Pencetus MySQL Diterangkan dengan Contoh: Mengautomasikan Tindakan Pangkalan Data

Susan Sarandon
Susan Sarandonasal
2024-12-20 16:15:13980semak imbas

MySQL Triggers Explained with Examples: Automating Database Actions

Pencetus MySQL Diterangkan dengan Contoh: Mengautomasikan Tindakan Pangkalan Data

MySQL Triggers ialah ciri berkuasa yang membolehkan anda secara automatik melaksanakan tindakan tertentu dalam pangkalan data sebagai tindak balas kepada peristiwa tertentu pada jadual, seperti INSERT, KEMASKINI , atau PADAM. Pencetus berguna untuk menguatkuasakan peraturan perniagaan, mengekalkan integriti data atau mengelog perubahan tanpa perlu mengurus secara eksplisit tindakan ini dalam kod aplikasi.

Dalam panduan ini, kami akan membincangkan perkara pencetus, cara ia berfungsi dan memberikan contoh praktikal untuk membantu anda memahami penggunaannya dalam MySQL.


Apakah Pemicu MySQL?

pencetus ialah satu set pernyataan SQL yang dilaksanakan secara automatik (atau "dicetuskan") oleh MySQL apabila peristiwa tertentu berlaku pada jadual. Acara itu boleh menjadi salah satu daripada yang berikut:

  • INSERT: Dicetuskan selepas operasi sisipan.
  • KEMASKINI: Dicetuskan selepas operasi kemas kini.
  • PADAM: Dicetuskan selepas operasi pemadaman.

Pencetus boleh ditakrifkan untuk dijalankan sama ada SEBELUM atau SELEPAS acara, yang memberi anda fleksibiliti dalam cara anda mahu mengendalikan data anda.

Sintaks untuk Mencipta Pencetus

Sintaks umum untuk mencipta pencetus dalam MySQL adalah seperti berikut:

CREATE TRIGGER trigger_name
    trigger_time trigger_event
    ON table_name
    FOR EACH ROW
    trigger_body;
  • trigger_name: Nama pencetus.
  • trigger_time: Boleh SEBELUM atau SELEPAS acara.
  • trigger_event: Boleh INSERT, UPDATE, atau DELETE.
  • table_name: Nama jadual yang dikaitkan dengan pencetus.
  • trigger_body: Pernyataan SQL yang akan dilaksanakan apabila pencetus dicetuskan.

Masa Pencetus: SEBELUM lwn. SELEPAS

  • SEBELUM Pencetus: Tindakan pencetus dilaksanakan sebelum peristiwa pencetus (cth., sebelum operasi sisipan, kemas kini atau padam). Ini membolehkan anda mengubah suai data sebelum ia diletakkan pada jadual.

  • AFTER Trigger: Tindakan pencetus dilaksanakan selepas peristiwa (cth., selepas rekod dimasukkan, dikemas kini atau dipadamkan). Ini berguna apabila anda ingin mengambil tindakan berdasarkan perubahan yang dibuat pada data, seperti pengelogan.


Contoh Trigger MySQL

1. Sisipkan Contoh Pencetus: Menetapkan Nilai Lalai Secara Automatik

Misalkan kita mempunyai jadual yang dipanggil pekerja yang mengandungi maklumat pekerja, termasuk lajur create_at. Kita boleh mencipta pencetus AFTER INSERT untuk menetapkan medan created_at secara automatik kepada cap masa semasa apabila rekod baharu dimasukkan.

CREATE TRIGGER trigger_name
    trigger_time trigger_event
    ON table_name
    FOR EACH ROW
    trigger_body;

Dalam contoh ini:

  • Pencetus dilaksanakan SELEPAS INSERT di atas meja pekerja.
  • Kata kunci BAHARU digunakan untuk merujuk kepada baris yang baru dimasukkan. NEW.id mewakili id ​​baris yang baru dimasukkan.
  • Pencetus mengemas kini lajur create_at bagi rekod yang baru dimasukkan ke cap masa semasa.

2. Contoh Pencetus Kemas Kini: Secara Automatik Mengira Nilai Yang Dikemas Kini

Bayangkan produk jadual dengan harga lajur dan diskaun, dan anda mahu mengemas kini medan harga_diskaun secara automatik apabila harga dikemas kini.

CREATE TRIGGER set_created_at
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
    UPDATE employees SET created_at = NOW() WHERE id = NEW.id;
END;

Dalam contoh ini:

  • Pencetus dilaksanakan SELEPAS KEMASKINI pada jadual produk.
  • NEW.price merujuk kepada harga yang dikemas kini dan OLD.price merujuk kepada nilai sebelumnya.
  • Jika harga telah berubah (NEW.price <> OLD.price), pencetus mengemas kini harga_diskaun berdasarkan harga dan diskaun baharu.

3. Padamkan Contoh Pencetus: Mencegah Pemadaman Data Kritikal

Anda boleh menggunakan pencetus untuk menguatkuasakan peraturan perniagaan, seperti menghalang pemadaman baris tertentu. Contohnya, dalam jadual pekerja, anda mungkin mahu menghalang pemadaman pekerja yang dibenderakan sebagai kritikal.

CREATE TRIGGER update_discounted_price
AFTER UPDATE ON products
FOR EACH ROW
BEGIN
    IF NEW.price <> OLD.price THEN
        UPDATE products SET discounted_price = NEW.price * (1 - NEW.discount / 100) WHERE id = NEW.id;
    END IF;
END;

Dalam contoh ini:

  • Pencetus dilaksanakan SEBELUM PADAM pada meja pekerja.
  • Kata kunci LAMA merujuk kepada data baris sebelum ia dipadamkan.
  • Jika lajur is_critical ditetapkan kepada 1, pencetus menimbulkan ralat menggunakan pernyataan SIGNAL, menghalang pemadaman.

4. Sisipkan Contoh Pencetus: Mencipta Log Audit

Pencetus boleh digunakan untuk tujuan pengelogan, seperti mengekalkan log audit untuk sisipan dalam jadual. Berikut ialah contoh yang mengelog setiap pekerja baharu yang ditambahkan pada jadual pekerja ke dalam jadual audit_log.

CREATE TRIGGER prevent_delete_critical_employee
BEFORE DELETE ON employees
FOR EACH ROW
BEGIN
    IF OLD.is_critical = 1 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot delete critical employee';
    END IF;
END;

Dalam contoh ini:

  • Pencetus dilaksanakan SELEPAS INSERT di atas meja pekerja.
  • Pencetus memasukkan rekod ke dalam jadual audit_log, log tindakan (INSERT), nama jadual (pekerja), id pekerja yang dimasukkan (NEW.id) dan cap waktu (NOW()).

Menguruskan Pencetus

  • Lihat Pencetus: Anda boleh melihat pencetus sedia ada dalam pangkalan data dengan menanyakan jadual information_schema.triggers:
CREATE TRIGGER trigger_name
    trigger_time trigger_event
    ON table_name
    FOR EACH ROW
    trigger_body;
  • Lepaskan Pencetus: Jika anda tidak memerlukan pencetus lagi, anda boleh memadamkannya dengan pernyataan DROP TRIGGER:
CREATE TRIGGER set_created_at
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
    UPDATE employees SET created_at = NOW() WHERE id = NEW.id;
END;

Pertimbangan Apabila Menggunakan Pencetus

  1. Kesan Prestasi: Pencetus menambah overhed pada operasi pangkalan data anda kerana ia melaksanakan pernyataan SQL tambahan. Berhati-hati tentang betapa kompleksnya logik pencetus, terutamanya untuk jadual besar atau operasi yang kerap.

  2. Trigger Nesting: Berhati-hati dengan pencetus yang mengubah suai jadual yang sama, kerana ini boleh menyebabkan gelung tidak terhingga atau penggunaan sumber yang berlebihan. MySQL tidak membenarkan pencetus untuk memanggil sendiri secara langsung (pencetus rekursif).

  3. Integriti Data: Pencetus berguna untuk memastikan integriti data, seperti menghalang pemadaman yang tidak diingini, tetapi ia mungkin sukar untuk dinyahpepijat. Sentiasa pastikan logik pencetus didokumentasikan dengan baik.

  4. Pengujian Pencetus: Sentiasa uji pencetus dengan teliti dalam persekitaran pembangunan atau pementasan sebelum menggunakannya ke pengeluaran, kerana kesan sampingan yang tidak diingini boleh menjejaskan prestasi aplikasi atau logik perniagaan.

Kesimpulan

Pencetus MySQL ialah ciri yang berkuasa untuk mengautomasikan tindakan sebagai tindak balas kepada perubahan dalam pangkalan data, seperti sisipan, kemas kini dan pemadaman. Dengan menggunakan pencetus, anda boleh menguatkuasakan peraturan perniagaan, mengekalkan integriti data dan mengautomasikan tugas seperti pengauditan atau pengelogan. Walau bagaimanapun, adalah penting untuk mempertimbangkan dengan teliti implikasi prestasi dan memastikan bahawa pencetus dilaksanakan dengan teliti untuk mengelakkan kesan negatif terhadap prestasi sistem anda.


Atas ialah kandungan terperinci Pencetus MySQL Diterangkan dengan Contoh: Mengautomasikan Tindakan Pangkalan Data. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn