Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL Trigger chỉ sau khi cập nhật nếu hàng đã thay đổi

Để giải quyết vấn đề, bạn có thể sử dụng dấu thời gian (cũ và mới) để kiểm tra xem dấu thời gian đó có không được cập nhật khi không có thay đổi nào đối với hàng. (Có thể đó là nguồn gây nhầm lẫn? Vì cái đó còn được gọi là 'đang cập nhật' nhưng không được thực thi khi không có thay đổi nào xảy ra) Các thay đổi trong vòng một giây sau đó sẽ không thực hiện phần đó của trình kích hoạt, nhưng trong một số trường hợp có thể ổn (như khi bạn có một ứng dụng từ chối các thay đổi nhanh.)

Ví dụ, thay vì

IF NEW.a <> OLD.a or NEW.b <> OLD.b /* etc, all the way to NEW.z <> OLD.z */ 
THEN  
  INSERT INTO bar (a, b) VALUES(NEW.a, NEW.b) ;
END IF

bạn có thể sử dụng

IF NEW.ts <> OLD.ts 
THEN  
  INSERT INTO bar (a, b) VALUES(NEW.a, NEW.b) ;
END IF

Sau đó, bạn không phải thay đổi trình kích hoạt của mình mỗi khi cập nhật lược đồ (vấn đề bạn đã đề cập trong câu hỏi.)

CHỈNH SỬA:Đã thêm ví dụ đầy đủ

create table foo (a INT, b INT, ts TIMESTAMP);
create table bar (a INT, b INT);

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 ;

select * from foo;
+------+------+---------------------+
| a    | b    | ts                  |
+------+------+---------------------+
|    1 |    1 | 2011-06-14 09:29:46 |
|    2 |    2 | 2011-06-14 09:29:46 |
|    3 |    3 | 2011-06-14 09:29:46 |
+------+------+---------------------+
3 rows in set (0.00 sec)

-- UPDATE without change
UPDATE foo SET b = 3 WHERE a = 3;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

-- the timestamo didnt change
select * from foo WHERE a = 3;
+------+------+---------------------+
| a    | b    | ts                  |
+------+------+---------------------+
|    3 |    3 | 2011-06-14 09:29:46 |
+------+------+---------------------+
1 rows in set (0.00 sec)

-- the trigger didn't run
select * from bar;
Empty set (0.00 sec)

-- UPDATE with change
UPDATE foo SET b = 4 WHERE a=3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

-- the timestamp changed
select * from foo;
+------+------+---------------------+
| a    | b    | ts                  |
+------+------+---------------------+
|    1 |    1 | 2011-06-14 09:29:46 |
|    2 |    2 | 2011-06-14 09:29:46 |
|    3 |    4 | 2011-06-14 09:34:59 |
+------+------+---------------------+
3 rows in set (0.00 sec)

-- and the trigger ran
select * from bar;
+------+------+---------------------+
| a    | b    | ts                  |
+------+------+---------------------+
|    3 |    4 | 2011-06-14 09:34:59 |
+------+------+---------------------+
1 row in set (0.00 sec)

Nó đang hoạt động do hành vi của mysql trong việc xử lý dấu thời gian. Dấu thời gian chỉ được cập nhật nếu có thay đổi xảy ra trong bản cập nhật.

Tài liệu tại đây:
https:// dev .mysql.com / doc / refman / 5.7 / en / timestamp-initialization.html

desc foo;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type      | Null | Key | Default           | Extra                       |
+-------+-----------+------+-----+-------------------+-----------------------------+
| a     | int(11)   | YES  |     | NULL              |                             |
| b     | int(11)   | YES  |     | NULL              |                             |
| ts    | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CONV () - Chuyển đổi số giữa các cơ sở khác nhau trong MySQL

  2. Hiệu suất MySQL:Chuyển đổi MySQL sang MariaDB

  3. Cách lấy danh sách ngày giữa hai ngày trong truy vấn chọn mysql

  4. Xóa bằng Tham gia trong MySQL

  5. Cách tính Doanh thu trong MySQL