Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Menghalang Pencetus MySQL 'SELEPAS KEMASKINI' daripada Menyalakan pada Baris Tidak Berubah?

Bagaimanakah Saya Boleh Menghalang Pencetus MySQL 'SELEPAS KEMASKINI' daripada Menyalakan pada Baris Tidak Berubah?

DDD
DDDasal
2025-01-13 22:38:47528semak imbas

How Can I Prevent MySQL

Halang pencetus MySQL daripada dilaksanakan pada baris yang tidak diubah suai

Pencetus MySQL dilaksanakan apabila operasi tertentu berlaku pada jadual, seperti sisipan, kemas kini atau padam. Walau bagaimanapun, secara lalai, pencetus "selepas kemas kini" diaktifkan walaupun tiada perubahan dibuat pada baris jadual.

Mengapakah pencetus "Selepas Kemas Kini" dilaksanakan walaupun tiada perubahan?

Cara biasa untuk mengesan perubahan dalam baris yang dikemas kini ialah membandingkan nilai lajur individu antara versi baris "baharu" dan "lama". Walau bagaimanapun, apabila bilangan lajur dalam jadual bertambah, pendekatan ini menjadi membosankan dan terdedah kepada ralat.

Penyelesaian: Manfaatkan cap waktu baris untuk mengenal pasti perubahan

Cara yang kemas untuk menyelesaikan masalah ini adalah dengan menggunakan lajur cap masa baris. MySQL mengekalkan dua lajur cap masa untuk setiap baris: cap masa penciptaan dan cap masa kemas kini. Cap masa ini dikemas kini secara automatik setiap kali baris disisipkan atau dikemas kini.

Pencetuskan pelaksanaan berdasarkan perbandingan cap masa

Dengan membandingkan cap masa baharu dan lama, kami boleh menentukan sama ada perubahan telah dibuat pada baris. Kod pencetus berikut menggambarkan pendekatan ini:

<code class="language-sql">CREATE TRIGGER ins_sum AFTER UPDATE ON foo
FOR EACH ROW
BEGIN
    IF NEW.ts <> OLD.ts THEN
        -- 已进行更改;执行触发器主体
    END IF;
END;</code>

Dalam pencetus ini, "NEW.ts" dan "OLD.ts" mewakili nilai cap masa baharu dan lama masing-masing. Jika nilai berbeza, perubahan berlaku dan badan pencetus dilaksanakan.

Contoh

Pertimbangkan contoh berikut:

<code class="language-sql">CREATE TABLE foo (a INT, b INT, ts TIMESTAMP);

-- 插入一些行
INSERT INTO foo (a, b) VALUES (1, 1);
INSERT INTO foo (a, b) VALUES (2, 2);
INSERT INTO foo (a, b) VALUES (3, 3);

-- 触发器定义
DELIMITER ///

CREATE TRIGGER ins_sum AFTER UPDATE ON foo
FOR EACH ROW
BEGIN
    IF NEW.ts <> OLD.ts THEN
        INSERT INTO bar (a, b) VALUES (NEW.a, NEW.b);
    END IF;
END;
///

DELIMITER ;

-- 不更改地更新
UPDATE foo SET b = 3 WHERE a = 3;

-- 更改地更新
UPDATE foo SET b = 4 WHERE a = 3;</code>

Pencetus tidak akan dijalankan selepas melakukan kemas kini pertama (tanpa membuat sebarang perubahan). Walau bagaimanapun, kemas kini kedua mengubah baris dan pencetus dilaksanakan, memasukkan baris baharu ke dalam jadual "bar".

Penyelesaian ini menghapuskan keperluan untuk membandingkan nilai lajur individu secara eksplisit dan memastikan bahawa pencetus hanya dilaksanakan apabila perubahan sebenar dibuat pada baris.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghalang Pencetus MySQL 'SELEPAS KEMASKINI' daripada Menyalakan pada Baris Tidak Berubah?. 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