ทริกเกอร์เป็น UPDATE หลังจาก UPDATE หรือไม่


13

ฉันต้องการทริกเกอร์บันทึกเวลาของการอัปเดตใด ๆ เป็น:

CREATE TRIGGER col_update
AFTER UPDATE ON col
FOR EACH ROW BEGIN
UPDATE col SET updated=NOW() WHERE id=NEW.id; // or OLD.id
END

ปัญหาคือเมื่อทริกเกอร์นี้พยายามอัปเดตupdatedคอลัมน์มันก็เป็นอีกเหตุการณ์หนึ่งของการอัพเดทที่รันทริกเกอร์ สิ่งนี้จะสร้างการวนซ้ำไม่สิ้นสุดซึ่งไม่ทำงาน

ฉันจะจัดเก็บเวลาอัปเดตในคอลัมน์ที่เกี่ยวข้องได้อย่างไร

ฉันต้องการใช้ทริกเกอร์เนื่องจากมีหลายคอลัมน์ในตาราง หากฉันพยายามตั้งเวลาอัปเดตด้วยตนเองฉันจะต้องแก้ไขข้อความค้นหาจำนวนมาก

คำตอบ:


17

ใช้BEFOREทริกเกอร์แทนและตั้งค่าupdatedคอลัมน์ที่กำหนดค่าเป็นNEW.updated(นี่จะเป็นการกำหนดอย่างง่ายไม่ใช่ an UPDATE) วิธีนี้คุณจะไม่เรียกใช้UPDATEs เพิ่มเติม

ร่างกายไกของคุณก็จะดูเหมือน

SET NEW.updated = NOW()

ผมมักจะใช้AFTERทริกเกอร์เพียงสำหรับการปรับเปลี่ยนอื่น ๆตารางBEFOREสำหรับการปรับเปลี่ยนใหม่ (หรือปรับปรุง) DELETEแถวหรือปราบปราม


1

ถ้าเหมือนในกรณีของคุณคุณต้องการเปลี่ยนเขตข้อมูลที่อัปเดตทุกครั้งที่มีการเปลี่ยนแปลงระเบียนคุณไม่จำเป็นต้องมีทริกเกอร์

คุณสามารถใช้การเริ่มต้น / อัพเดทอัตโนมัติของ MySQL เช่นนี้:

ALTER TABLE `yourtabelname` ADD `updated` DATETIME on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

หรือในช่วงเวลาของการสร้างตารางจากเอกสาร :

CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.