Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

การสร้าง Trigger ใน MySQL เพื่อ Insert ข้อมูลไปตารางที่สองอัตโนมัติ

ใช้ TRIGGER ก่อน INSERT (BEFORE INSERT) บนตารางแรก เพื่อเพิ่มข้อมูลเข้าไปในตารางที่สองอัตโนมัติ

Syntax ของ Trigger

DELIMITER // 
create trigger yourTriggerName before insert on yourTableName1 
    for each row 
    begin 
        insert into yourTableName2 values (yourValue1,yourValue2,...N); 
    end ; // 
DELIMITER ;

สร้างตารางแรก

mysql> create table DemoTable1 ( 
    StudentId int, 
    StudentName varchar(40) ); 
Query OK, 0 rows affected (0.69 sec)

สร้างตารางที่สอง

mysql> create table DemoTable2( 
    Id int, 
    Name varchar(40) ); 
Query OK, 0 rows affected (0.61 sec)

สร้าง Trigger (BEFORE INSERT)

mysql> DELIMITER // 
mysql> create trigger afterinserttrigger before insert on DemoTable1 for each row 
    begin 
        insert into DemoTable2 values (10,'Chris'); 
    end ; // 
Query OK, 0 rows affected (0.13 sec) 
mysql> DELIMITER ;

ทดสอบ: Insert ข้อมูลในตารางแรก

mysql> insert into DemoTable1 values(1,'David'); Query OK, 1 row affected (0.21 sec)

ตรวจสอบตารางแรก

mysql> select *from DemoTable1;
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
|         1 | David       |
+-----------+-------------+
1 row in set (0.00 sec)

ตรวจสอบตารางที่สอง (ถูก Insert อัตโนมัติ)

mysql> select *from DemoTable2;
+------+-------+
| Id   | Name  |
+------+-------+
|   10 | Chris |
+------+-------+
1 row in set (0.00 sec)

ประเภท Trigger ใน MySQL

TimingEventใช้งาน
BEFOREINSERTValidate/Modify ข้อมูลก่อน Insert
AFTERINSERTLog/Audit/Insert ตารางอื่น หลัง Insert สำเร็จ
BEFOREUPDATEValidate/Modify ก่อน Update
AFTERUPDATELog/Audit หลัง Update
BEFOREDELETEArchive/Check ก่อน Delete
AFTERDELETELog/Audit หลัง Delete

เข้าถึงค่าใหม่/เก่า ใน Trigger

  • NEW.column_name - ค่าใหม่ (INSERT, UPDATE)
  • OLD.column_name - ค่าเก่า (UPDATE, DELETE)

ตัวอย่างใช้ NEW

CREATE TRIGGER after_insert_log 
AFTER INSERT ON DemoTable1 
FOR EACH ROW 
BEGIN 
    INSERT INTO DemoTable2 (Id, Name) VALUES (NEW.StudentId, NEW.StudentName); 
END;

ข้อควรระวัง

  • Trigger เพิ่ม Overhead ให้ทุก INSERT/UPDATE/DELETE
  • ไม่สามารถเรียก Stored Procedure ที่มี Transaction Control (COMMIT/ROLLBACK) ได้
  • Debug ยาก ใช้ Logging table แทน