Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pemicu MySQL setelah pembaruan hanya jika baris telah berubah

Sebagai solusinya, Anda dapat menggunakan stempel waktu (lama dan baru) untuk memeriksa, yang itu tidak diperbarui ketika tidak ada perubahan pada baris. (Mungkin itu sumber kebingungannya? Karena itu juga disebut 'sedang diperbarui' tetapi tidak dijalankan ketika tidak ada perubahan yang terjadi) Perubahan dalam satu detik kemudian tidak akan mengeksekusi bagian pemicu itu, tetapi dalam beberapa kasus bisa saja baik-baik saja (seperti saat Anda memiliki aplikasi yang menolak perubahan cepat.)

Misalnya, daripada

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

Anda dapat menggunakan

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

Maka Anda tidak perlu mengubah pemicu Anda setiap kali Anda memperbarui skema (masalah yang Anda sebutkan dalam pertanyaan.)

EDIT:Menambahkan contoh lengkap

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)

Ini berfungsi karena perilaku mysql dalam menangani stempel waktu. Stempel waktu hanya diperbarui jika terjadi perubahan dalam pembaruan.

Dokumentasi ada di sini:
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. Diperlukan untuk menggabungkan 2 tabel dengan FK mereka di tabel ke-3

  2. Kunci Asing MySQL

  3. Plugin otentikasi 'caching_sha2_password' tidak didukung

  4. Dasar-dasar Tuning MySQL di Dedicated Server

  5. LINTAS/LUAR BERLAKU di MySQL