Rumah >pembangunan bahagian belakang >tutorial php >Automasi Tindakan dengan pencetus MySQL
mata teras
Apakah pencetus MySQL?
Pencetus diperkenalkan dalam versi MySQL 5.0.2 dan hanya salah satu ciri tambahan MySQL yang dapat membantu kita mempermudah kerja kita sebagai pemaju. Mereka secara automatik dipanggil sebelum atau selepas tindakan (memasukkan, mengemas kini, memadam) di atas meja. Anda perlu mempunyai keizinan yang sesuai untuk mencipta pencetus. Sebelum MySQL 5.1.6 anda memerlukan keizinan super, tetapi dalam 5.1.6 ini berubah dan anda memerlukan keizinan pencetus. Biasanya, pelan hosting bersama tidak membenarkan super kerana mudah disalahgunakan, jadi anda hanya dapat menggunakannya pada pelayan yang anda mempunyai lebih banyak kebenaran, seperti pelayan khusus (maya) atau localhost anda, bergantung pada cara anda menggunakan Versi MySQL. Berikut adalah beberapa arahan cepat lain mengenai pencetus:mari kita lihat sintaks asas pencetus dengan memecahkannya ke dalam bentuk asalnya:
<code class="language-sql">CREATE TRIGGER TrigName [BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON tableName FOR EACH ROW BEGIN #action(s) to perform END</code>
Apabila anda membuat pencetus, anda boleh memilih sama ada ia mencetuskan sebelum atau selepas tindakan berlaku; Jika anda ingin mengubah suai data masuk yang memasuki pangkalan data, anda perlu sebelum ini. Walau bagaimanapun, jika anda melakukan sesuatu kerana tindakan sebelumnya, anda harus menggunakan pernyataan selepas itu. Operasi yang akan mencetuskan pencetus boleh memasukkan, mengemas kini, atau memadam, kerana ketiga -tiga kenyataan ini adalah satu -satunya pernyataan yang akan menyebabkan data dalam jadual diubahsuai.
Gunakan pencetus ke situasi sebenar
Pencetus sangat berguna dalam banyak kes. Penggunaan yang terkenal adalah untuk mengekalkan integriti satu set jadual dengan mencetuskan penghapusan rekod usang apabila kunci asing tidak digunakan. Mereka juga boleh digunakan untuk meningkatkan atau mengurangkan jadual statistik secara automatik apabila memasukkan/memadam baru, merekodkan perubahan kepada data dalam pangkalan data, menyimpan jadual yang disegerakkan dengan jadual lain, dan banyak lagi. Dalam artikel ini, kami akan menggunakannya untuk memproses beberapa pengiraan. Ini adalah kes yang kita ada syarikat yang menyewa dewannya dengan harga £ 30 per jam. Mereka merekodkan nama, permulaan dan akhir masa setiap acara yang diadakan di dalam dewan, dan kemudian mengira masa dan perbelanjaan yang perlu dibayar dalam jadual pendapatan. Nama dan masa permulaan acara pada mulanya dimasukkan ke dalam jadual acara untuk menempah lobi, dan kemudian kos sewa dikemas kini pada baris itu hanya selepas acara selesai. Tempoh peristiwa (dalam minit) perlu dikira, di mana masa mula akan dikurangkan dari masa akhir, dan yuran sewa akan dikira dengan mengalikan jumlah masa sebanyak 0.5 (£ 30 per jam, 50 pence per minit). Kami boleh menggunakan PHP untuk melakukan pengiraan tempoh dan perbelanjaan peristiwa semasa mengemas kini maklumat acara (dengan memilih data yang dimasukkan, mengira tempoh dan perbelanjaan sewa, dan kemudian memasukkan atau mengemas kini senarai pendapatan), atau kami hanya boleh menggunakan pencetus untuk mengautomasikan proses ini dan mengurangkan Beberapa kod PHP. Mari kita sediakan dua jadual asas dan masukkan beberapa data langganan maya ke dalam acara untuk memulakan operasi.
<code class="language-sql">CREATE TABLE events ( id INTEGER NOT NULL AUTO_INCREMENT, event_name VARCHAR(50) NOT NULL, event_start TIMESTAMP NOT NULL DEFAULT 0, event_end TIMESTAMP NOT NULL DEFAULT 0, PRIMARY KEY (id) ) ENGINE=INNODB; CREATE TABLE revenue ( id INTEGER NOT NULL AUTO_INCREMENT, event_id INTEGER NOT NULL, hire_time INTEGER NOT NULL, hire_fees FLOAT NOT NULL, PRIMARY KEY (id), FOREIGN KEY (event_id) REFERENCES events(id) ON DELETE CASCADE, UNIQUE (event_id) )ENGINE=INNODB; INSERT INTO events VALUES (NULL, 'Birthday Party', '2012-11-08 14:30:00', 0), (NULL, 'Wedding', '2012-12-02 13:00:00', 0);</code>
Selepas menubuhkan dua jadual, kita boleh terus mencipta pencetus yang bernama Costcalc. Pencetus ditetapkan untuk api selepas kemas kini berlaku pada jadual acara dan kemudian melakukan pengiraan yang disebutkan di atas. Ia kemudian memasukkan atau mengemas kini senarai pendapatan (jika ID acara yang sedia ada ditetapkan).
<code class="language-sql">CREATE TRIGGER TrigName [BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON tableName FOR EACH ROW BEGIN #action(s) to perform END</code>
Apabila mencipta pencetus (serupa dengan peristiwa dan rutin yang disimpan), perkara pertama yang perlu kita lakukan ialah menentukan pembatas baru yang mewakili akhir pencetus. Ini dilakukan dengan menggunakan kata kunci pembatas, diikuti dengan simbol tersuai (atau simbol) dan memerlukan pencetus untuk dilaksanakan secara keseluruhan, bukannya MySQL hanya melaksanakan kenyataan dalaman sahaja. Kami kemudian menentukan nama pencetus, masa, peristiwa, dan jadual di mana ia akan ditetapkan untuk dicetuskan. Dalam contoh ini, kami menetapkan masa pencetus untuk bekerja selepas pernyataan kemas kini berlaku, kerana kami ingin melaksanakan pencetus hanya selepas kemas kini yang berjaya; Seterusnya, kami menggunakan Pernyataan Kompaun Begin ... untuk menampung fungsi pencetus. Badan pencetus pertama mengisytiharkan dua pembolehubah: baris dan masa. Kami memilih bilangan baris dari jadual acara, di mana ID merujuk kepada baris yang baru saja diubahsuai, dan satu (atau dua) event_start dan event_end kali telah diubahsuai, dan masa event_end tidak sama dengan sifar. Ini adalah untuk menjelaskan sama ada sebarang tindakan diperlukan pada penyata pendapatan, kerana yuran sewa hanya boleh dikira melalui perubahan ini. Sebaik sahaja kita tahu kita dapat mengira masa dan perbelanjaan, kita menetapkan pembolehubah masa untuk menyamai bilangan minit dari awal hingga akhir lajur. Dengan mendarabkan nombor ini sebanyak 0.5, kita juga boleh mendapatkan kos sewa. Oleh kerana lajur Event_ID adalah unik, kita hanya boleh mempunyai satu ID yang sepadan dengan jadual acara; Dalam pernyataan MySQL, anda juga dapat melihat bahawa kata kunci lama dan baru digunakan dalam Pilih dan menggantikan pernyataan di atas dan dalam ungkapan nilai pembolehubah masa. Penggunaan kedua -dua kata kunci ini bergantung kepada peristiwa dalam keadaan anda dan apabila pencetus dicetuskan.
Skrip PHP yang sepadan yang akan digunakan untuk memulakan pencetus akan termasuk kelas (dipanggil EventHandler), serta kod panggilan pelanggan kami. Kelas akan menyambung ke pangkalan data MySQL kami melalui PDO dan akan mengandungi kaedah updateEvent () yang akan dipanggil apabila kandungan acara perlu dikemas kini.
<code class="language-sql">CREATE TRIGGER TrigName [BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON tableName FOR EACH ROW BEGIN #action(s) to perform END</code>
pertama kali membuat kelas EventHandler kami, di mana harta $ db ditakrifkan untuk memegang contoh kelas PDO, yang ditetapkan oleh kaedah pembina. Kemudian, kami meneruskan untuk membuat kaedah updateEvent () kami, di mana tiga parameter ditakrifkan. Parameter pertama menentukan lajur yang ingin kami kemas kini dalam jadual acara dan membolehkan salah satu daripada tiga nilai: nama, permulaan, akhir. Parameter kedua memegang nilai yang akan dimasukkan atau nilai semasa lajur yang dikemas kini; Selepas memastikan bahawa nama lajur sah, kami menanyakan jadual kami melalui pertanyaan parameter, dan akhirnya periksa sama ada mana -mana baris telah dikemas kini. Selepas membuat kelas, kami terus memanggilnya. Kami meluluskan contoh objek PDO sebagai parameter kepada kelas EventHandler. Kaedah updateEvent () kemudiannya akan dipanggil empat kali dengan nilai yang berbeza untuk menunjukkan bagaimana pencetus kami akan bertindak balas terhadap kemas kini yang dibuat pada jadual acara. Dua kemas kini pertama tidak akan menyebabkan pencetus kami memasukkan atau mengemas kini baris, kerana kami masih tidak mempunyai maklumat yang diperlukan untuk mengira tempoh acara dan yuran sewa. Apa yang kami lakukan ialah mengemas kini nama acara dan menangguhkan masa permulaannya dengan dua hari. Walau bagaimanapun, dua kemas kini yang akan datang memerlukan fungsi pencetus kami, sebagai kemas kini pertama mentakrifkan masa akhir, kemas kini kedua mentakrifkan masa akhir sebagai satu jam kemudian, mengakibatkan perubahan dalam tempoh, jadi kos sewa juga telah berubah. Di sinilah kita memerlukan pernyataan Ganti, kerana kita mengenakan kekangan di atas meja ketika membuat jadual, dan kita hanya dapat memiliki satu rekod setiap ID acara.
Kesimpulan
pencetus MySQL, jika digunakan dengan betul, bukan sahaja boleh memberi kesan positif terhadap prestasi laman web, tetapi juga mengelakkan menulis banyak kod PHP untuk mengendalikan operasi tersebut. Saya harap anda dapati mereka berguna dalam projek anda seperti yang saya lakukan dalam projek saya, jadi jangan ragu untuk menggunakan pencetus dengan berani! gambar dari Fotolia
FAQS on Automation of Operations with MySQL Triggers
MySQL Trigger adalah program yang disimpan yang secara automatik dipanggil sebagai tindak balas kepada peristiwa yang berlaku dalam jadual (seperti penyisipan, kemas kini, atau padam). Pencetus digunakan untuk mengekalkan integriti maklumat dalam pangkalan data dan secara automatik dipanggil apabila operasi tertentu berlaku di atas jadual. Mereka boleh dilaksanakan sebelum atau selepas acara.
Mencipta pencetus MySQL melibatkan pernyataan pencetus, yang termasuk nama pencetus, peristiwa pencetus, dan pernyataan yang akan dilaksanakan apabila peristiwa itu berlaku. Berikut adalah contoh asas:
<code class="language-sql">CREATE TABLE events ( id INTEGER NOT NULL AUTO_INCREMENT, event_name VARCHAR(50) NOT NULL, event_start TIMESTAMP NOT NULL DEFAULT 0, event_end TIMESTAMP NOT NULL DEFAULT 0, PRIMARY KEY (id) ) ENGINE=INNODB; CREATE TABLE revenue ( id INTEGER NOT NULL AUTO_INCREMENT, event_id INTEGER NOT NULL, hire_time INTEGER NOT NULL, hire_fees FLOAT NOT NULL, PRIMARY KEY (id), FOREIGN KEY (event_id) REFERENCES events(id) ON DELETE CASCADE, UNIQUE (event_id) )ENGINE=INNODB; INSERT INTO events VALUES (NULL, 'Birthday Party', '2012-11-08 14:30:00', 0), (NULL, 'Wedding', '2012-12-02 13:00:00', 0);</code>
tidak boleh dipanggil secara langsung. MySQL tidak menyokong memanggil skrip PHP daripada pencetus. Walau bagaimanapun, anda boleh melakukan ini secara tidak langsung dengan menggunakan UDF (fungsi yang ditentukan oleh pengguna) atau menggunakan sistem luaran untuk memantau perubahan dalam pangkalan data dan kemudian panggil skrip PHP.
Sintaks untuk mencipta pencetus dalam MySQL adalah seperti berikut:
<code class="language-sql">CREATE TRIGGER TrigName [BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON tableName FOR EACH ROW BEGIN #action(s) to perform END</code>
Automasi di MySQL boleh dicapai melalui pencetus, prosedur yang disimpan, dan peristiwa. Pencetus boleh digunakan untuk mengautomasikan tugas yang perlu dilakukan sebagai tindak balas kepada perubahan data tertentu. Prosedur yang disimpan membolehkan anda merangkumi satu siri perintah ke dalam rutin yang boleh dipanggil tunggal. Peristiwa adalah tugas yang dijalankan mengikut jadual.
Beberapa batasan pencetus MySQL termasuk: mereka hanya boleh dikaitkan dengan satu jadual, mereka tidak dapat mengembalikan set keputusan, mereka tidak dapat menerima parameter, dan tidak boleh dipanggil secara langsung seperti prosedur yang disimpan.
Debugging MySQL Triggers boleh mencabar kerana tidak ada debugger terbina dalam. Walau bagaimanapun, anda boleh menggunakan penyelesaian, seperti memasukkan nilai ke dalam jadual berasingan untuk mengesan aliran pelaksanaan, atau menggunakan alat pihak ketiga seperti Debugger MySQL.
Ya. Walau bagaimanapun, anda harus berhati -hati apabila melakukan ini, kerana ia boleh membawa kepada rantaian kompleks peristiwa yang sukar untuk dikendalikan dan debug.
anda boleh memadam pencetus MySQL menggunakan pernyataan Drop Trigger diikuti dengan nama pencetus. Contohnya:
<code class="language-sql">CREATE TABLE events ( id INTEGER NOT NULL AUTO_INCREMENT, event_name VARCHAR(50) NOT NULL, event_start TIMESTAMP NOT NULL DEFAULT 0, event_end TIMESTAMP NOT NULL DEFAULT 0, PRIMARY KEY (id) ) ENGINE=INNODB; CREATE TABLE revenue ( id INTEGER NOT NULL AUTO_INCREMENT, event_id INTEGER NOT NULL, hire_time INTEGER NOT NULL, hire_fees FLOAT NOT NULL, PRIMARY KEY (id), FOREIGN KEY (event_id) REFERENCES events(id) ON DELETE CASCADE, UNIQUE (event_id) )ENGINE=INNODB; INSERT INTO events VALUES (NULL, 'Birthday Party', '2012-11-08 14:30:00', 0), (NULL, 'Wedding', '2012-12-02 13:00:00', 0);</code>Bolehkah pencetus MySQL digunakan untuk pengesahan data?
Atas ialah kandungan terperinci Automasi Tindakan dengan pencetus MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!