Kích hoạt để CẬP NHẬT sau khi CẬP NHẬT?


13

Tôi muốn kích hoạt để ghi lại thời gian của bất kỳ cập nhật nào dưới dạng:

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

Vấn đề là khi trình kích hoạt này cố gắng cập nhật updatedcột, thì đó cũng là một sự kiện cập nhật khác, chạy trình kích hoạt. Điều này sẽ tạo ra một vòng lặp vô hạn, không hoạt động.

Làm cách nào để lưu trữ thời gian cập nhật trong cột tương ứng?

Tôi muốn sử dụng một kích hoạt bởi vì có nhiều cột trong bảng. Nếu tôi cố gắng đặt thời gian cập nhật thủ công, tôi sẽ cần sửa đổi nhiều truy vấn.

Câu trả lời:


17

BEFOREThay vào đó, hãy sử dụng trình kích hoạt và đặt updatedcột gán giá trị cho NEW.updated(đây sẽ là một phép gán đơn giản, không phải là một UPDATE). Bằng cách này, bạn sẽ không kích hoạt thêm UPDATEs.

Cơ thể kích hoạt của bạn sẽ trông giống như

SET NEW.updated = NOW()

Tôi thường chỉ sử dụng các AFTERkích hoạt để sửa đổi các bảng khác , BEFOREđể sửa đổi hàng mới (hoặc cập nhật) hoặc triệt tiêu DELETE.


1

Nếu như trong trường hợp của bạn, bạn muốn thay đổi trường cập nhật mỗi khi bản ghi được thay đổi, bạn không cần kích hoạt.

Bạn có thể sử dụng khởi tạo / cập nhật tự động của MySQL như thế này:

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

Hoặc tại thời điểm tạo bảng, từ các tài liệu :

CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.