2009-04-22 22 views
28

Tôi có một bảng:Sử dụng MySQL gây nên đăng nhập tất cả các thay đổi bảng vào một bảng thứ

CREATE TABLE `data_table` (
`data_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , 
`field1` INT NOT NULL , 
`field2` INT NOT NULL , 
`field3` INT NOT NULL 
) ENGINE = MYISAM ; 

Tôi sẽ đăng nhập để đăng nhập bất kỳ cơ hội để field1, 2, hoặc 3 đến:

CREATE TABLE `data_tracking` (
`tracking_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , 
`data_id` INT NOT NULL , 
`field` VARCHAR(50) NOT NULL , 
`old_value` INT NOT NULL , 
`new_value` INT NOT NULL , 
`modified` DATETIME NOT NULL 
) ENGINE = MYISAM ; 

Tôi đang sử dụng MySQL 5 và tôi muốn tạo trình kích hoạt để thực hiện. Tôi muốn chèn một hàng mới vào data_tracking bất cứ lúc nào data_table được cập nhật, và ghi lại giá trị cũ/cập nhật, cũng như các lĩnh vực thay đổi. Tôi đã thử những điều sau mà không thành công.

DELIMITER $$ 

DROP TRIGGER `update_data `$$ 

CREATE TRIGGER `update_data` AFTER UPDATE on `data_table` 
FOR EACH ROW 
BEGIN 
    IF (NEW.field1 != OLD.field1) THEN 
     INSERT INTO data_tracking set old_value = OLD.field1, new_value = NEW.field1, field = "field1"; 
    END IF; 
END$$ 

DELIMITER ; 

Đã xảy ra lỗi trên dòng chèn, tôi không hoàn toàn chắc chắn cú pháp trên đó nên là gì hoặc nếu tôi thực hiện đúng cách. Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn.

Trả lời

38

Cú pháp chèn là

INSERT INTO table (columns_list) VALUES (values_list) 

để chèn của bạn sẽ trông như thế này (tôi không phải một chuyên gia về MySQL nhưng bạn có thể phù hợp với truy vấn):

INSERT INTO data_tracking 
(`data_id` , `field` , `old_value` , `new_value` , `modified`) 
VALUES 
(NEW.data_id, 'field1', OLD.field, NEW.field, CURRENT_DATETIME()); 

Và lặp lại nó cho biến thể trên field2 và field3

Tôi nghĩ đây sẽ là trình kích hoạt hoàn chỉnh, vui lòng thử:

DELIMITER $$ 

DROP TRIGGER `update_data `$$ 

CREATE TRIGGER `update_data` AFTER UPDATE on `data_table` 
FOR EACH ROW 
BEGIN 
    IF (NEW.field1 != OLD.field1) THEN 
     INSERT INTO data_tracking 
      (`data_id` , `field` , `old_value` , `new_value` , `modified`) 
     VALUES 
      (NEW.data_id, "field1", OLD.field1, NEW.field1, NOW()); 
    END IF; 
    IF (NEW.field2 != OLD.field2) THEN 
     INSERT INTO data_tracking 
      (`data_id` , `field` , `old_value` , `new_value` , `modified`) 
     VALUES 
      (NEW.data_id, "field2", OLD.field2, NEW.field2, NOW()); 
    END IF; 
    IF (NEW.field3 != OLD.field3) THEN 
     INSERT INTO data_tracking 
      (`data_id` , `field` , `old_value` , `new_value` , `modified`) 
     VALUES 
      (NEW.data_id, "field3", OLD.field3, NEW.field3, NOW()); 
    END IF; 
END$$ 

DELIMITER ; 
+2

Tôi vừa thêm suy nghĩ của mình về trình kích hoạt –

+0

bạn có chắc là "data_table" của bạn có trường có tên data_id không? –

+1

Rất tiếc, xin lỗi, bạn nói đúng, khi tôi tạo các bảng mẫu của mình, tôi đã thay đổi một trong số chúng ở phút cuối cùng. Điều này làm việc hoàn hảo. Xin lỗi vì sự nhầm lẫn: ( – Rob

Các vấn đề liên quan