2010-05-25 23 views
11

Tôi gặp sự cố khi cố gắng tạo hai cột TIMESTAMP trong cơ sở dữ liệu của mình. Một gọi là created và một gọi là updated. Tôi cho rằng sẽ dễ dàng đặt giá trị mặc định của cả hai thành số CURRENT_TIMESTAMP và sau đó là ON UPDATE CURRENT_TIMESTAMP cho cột updated. Nhưng đối với một số lý do MySQL có nghĩa là đó là một ý tưởng tồi ... vì vậy tôi đã tìm cách để làm điều này mà không cần phải thiết lập một trong số họ trong truy vấn chèn.MySQL: Cách tạo trình kích hoạt để đặt ngày tạo cho các hàng mới

Tôi đã tìm thấy một cách bằng cách sử dụng trình kích hoạt trong this answer nhưng tôi vẫn gặp phải lỗi. Tôi vừa mới thực sự tạo trình kích hoạt, nhưng giờ tôi gặp lỗi khi cố gắng chèn các hàng mới tuyên bố rằng

1442 - Không thể cập nhật bảng 'tác vụ' trong chức năng/trình kích hoạt được lưu trữ vì nó đã được sử dụng bởi câu lệnh đã gọi hàm/trigger được lưu trữ này.

Và tôi không hiểu điều đó có nghĩa gì cả. Vì vậy, tôi đã hy vọng một ai đó ở đây có thể làm sáng tỏ chủ đề này.

SQL Tôi sử dụng để tạo ra bảng và kích hoạt như sau:

CREATE TABLE `tasks` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `created` DATETIME, 
    `updated` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `title` VARCHAR(255) NOT NULL, 
    `notes` TEXT, 
    `status_id` INT(10) UNSIGNED NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `status_id` (`status_id`), 
    CONSTRAINT `fk_tasks_statuses` FOREIGN KEY (`status_id`) REFERENCES `statuses` (`id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TRIGGER task_creation_timestamp AFTER INSERT ON tasks 
FOR EACH ROW 
UPDATE tasks SET created = updated WHERE id = NEW.id; 

Tôi đang làm gì sai ở đây?

Trả lời

24

kích hoạt của bạn cần phải được "trước khi chèn", và bạn cần phải sử dụng SET thay vì UPDATE:

CREATE TRIGGER task_creation_timestamp BEFORE INSERT ON tasks 
FOR EACH ROW 
SET NEW.created = NOW(); 
Các vấn đề liên quan