
- MySQL 基礎
- MySQL - 首頁
- MySQL - 簡介
- MySQL - 特性
- MySQL - 版本
- MySQL - 變數
- MySQL - 安裝
- MySQL - 管理
- MySQL - PHP 語法
- MySQL - Node.js 語法
- MySQL - Java 語法
- MySQL - Python 語法
- MySQL - 連線
- MySQL - Workbench
- MySQL 資料庫
- MySQL - 建立資料庫
- MySQL - 刪除資料庫
- MySQL - 選擇資料庫
- MySQL - 顯示資料庫
- MySQL - 複製資料庫
- MySQL - 資料庫匯出
- MySQL - 資料庫匯入
- MySQL - 資料庫資訊
- MySQL 使用者
- MySQL - 建立使用者
- MySQL - 刪除使用者
- MySQL - 顯示使用者
- MySQL - 修改密碼
- MySQL - 授予許可權
- MySQL - 顯示許可權
- MySQL - 收回許可權
- MySQL - 鎖定使用者賬戶
- MySQL - 解鎖使用者賬戶
- MySQL 表
- MySQL - 建立表
- MySQL - 顯示錶
- MySQL - 修改表
- MySQL - 重命名錶
- MySQL - 克隆表
- MySQL - 截斷表
- MySQL - 臨時表
- MySQL - 修復表
- MySQL - 描述表
- MySQL - 新增/刪除列
- MySQL - 顯示列
- MySQL - 重新命名列
- MySQL - 表鎖定
- MySQL - 刪除表
- MySQL - 派生表
- MySQL 查詢
- MySQL - 查詢
- MySQL - 約束
- MySQL - 插入查詢
- MySQL - 選擇查詢
- MySQL - 更新查詢
- MySQL - 刪除查詢
- MySQL - 替換查詢
- MySQL - 插入忽略
- MySQL - 插入重複鍵更新
- MySQL - 插入到選擇
- MySQL 運算子和子句
- MySQL - WHERE 子句
- MySQL - LIMIT 子句
- MySQL - DISTINCT 子句
- MySQL - ORDER BY 子句
- MySQL - GROUP BY 子句
- MySQL - HAVING 子句
- MySQL - AND 運算子
- MySQL - OR 運算子
- MySQL - LIKE 運算子
- MySQL - IN 運算子
- MySQL - ANY 運算子
- MySQL - EXISTS 運算子
- MySQL - NOT 運算子
- MySQL - 不等於運算子
- MySQL - IS NULL 運算子
- MySQL - IS NOT NULL 運算子
- MySQL - BETWEEN 運算子
- MySQL - UNION 運算子
- MySQL - UNION 與 UNION ALL
- MySQL - MINUS 運算子
- MySQL - INTERSECT 運算子
- MySQL - INTERVAL 運算子
- MySQL 連線
- MySQL - 使用連線
- MySQL - INNER JOIN
- MySQL - LEFT JOIN
- MySQL - RIGHT JOIN
- MySQL - CROSS JOIN
- MySQL - FULL JOIN
- MySQL - 自連線
- MySQL - 刪除連線
- MySQL - 更新連線
- MySQL - UNION 與 JOIN
- MySQL 觸發器
- MySQL - 觸發器
- MySQL - 建立觸發器
- MySQL - 顯示觸發器
- MySQL - 刪除觸發器
- MySQL - 插入前觸發器
- MySQL - 插入後觸發器
- MySQL - 更新前觸發器
- MySQL - 更新後觸發器
- MySQL - 刪除前觸發器
- MySQL - 刪除後觸發器
- MySQL 資料型別
- MySQL - 資料型別
- MySQL - VARCHAR
- MySQL - BOOLEAN
- MySQL - ENUM
- MySQL - DECIMAL
- MySQL - INT
- MySQL - FLOAT
- MySQL - BIT
- MySQL - TINYINT
- MySQL - BLOB
- MySQL - SET
- MySQL 正則表示式
- MySQL - 正則表示式
- MySQL - RLIKE 運算子
- MySQL - NOT LIKE 運算子
- MySQL - NOT REGEXP 運算子
- MySQL - regexp_instr() 函式
- MySQL - regexp_like() 函式
- MySQL - regexp_replace() 函式
- MySQL - regexp_substr() 函式
- MySQL 函式 & 運算子
- MySQL - 日期和時間函式
- MySQL - 算術運算子
- MySQL - 數值函式
- MySQL - 字串函式
- MySQL - 聚合函式
- MySQL 其他概念
- MySQL - NULL 值
- MySQL - 事務
- MySQL - 使用序列
- MySQL - 處理重複項
- MySQL - SQL 注入
- MySQL - 子查詢
- MySQL - 註釋
- MySQL - 檢查約束
- MySQL - 儲存引擎
- MySQL - 將表匯出到 CSV 檔案
- MySQL - 將 CSV 檔案匯入資料庫
- MySQL - UUID
- MySQL - 公共表表達式
- MySQL - ON DELETE CASCADE
- MySQL - Upsert
- MySQL - 水平分割槽
- MySQL - 垂直分割槽
- MySQL - 遊標
- MySQL - 儲存函式
- MySQL - 訊號
- MySQL - 重新發送訊號
- MySQL - 字元集
- MySQL - 校對
- MySQL - 萬用字元
- MySQL - 別名
- MySQL - ROLLUP
- MySQL - 當天日期
- MySQL - 字面量
- MySQL - 儲存過程
- MySQL - EXPLAIN
- MySQL - JSON
- MySQL - 標準差
- MySQL - 查詢重複記錄
- MySQL - 刪除重複記錄
- MySQL - 選擇隨機記錄
- MySQL - SHOW PROCESSLIST
- MySQL - 更改列型別
- MySQL - 重置自動遞增
- MySQL - Coalesce() 函式
- MySQL 有用資源
- MySQL - 有用函式
- MySQL - 語句參考
- MySQL - 快速指南
- MySQL - 有用資源
- MySQL - 討論
MySQL - 刪除後觸發器
一般來說,觸發器被定義為對事件的響應。在 MySQL 中,觸發器被稱為特殊的儲存過程,因為它不需要像其他儲存過程那樣顯式呼叫。觸發器在所需事件觸發時自動執行。觸發器分為兩種型別:前觸發器和後觸發器。
這些觸發器可以是對錶上的插入操作、更新操作或刪除操作的響應。因此,這些特殊的儲存過程在執行 INSERT、UPDATE 或 DELETE 語句時會做出響應。
MySQL 刪除後觸發器
刪除後觸發器是 MySQL 資料庫支援的行級觸發器。此觸發器在從資料庫表的一行刪除值後立即執行。
行級觸發器是一種每次修改一行時都會執行的觸發器。對於在表中進行的每個單獨事務(如插入、刪除、更新操作),一個觸發器會自動執行。
當在資料庫中執行 DELETE 語句時,首先執行觸發器,然後從表中刪除所述值。
語法
以下是建立 MySQL 中 AFTER DELETE 觸發器的語法:
CREATE TRIGGER trigger_name AFTER DELETE ON table_name FOR EACH ROW BEGIN -- trigger body END;
示例
在此示例中,我們建立一個名為“CUSTOMERS”的表,以演示 AFTER DELETE 觸發器,使用以下查詢:
CREATE TABLE CUSTOMERS( ID INT NOT NULL, NAME VARCHAR(20) NOT NULL, AGE INT NOT NULL, ADDRESS VARCHAR(25), SALARY DECIMAL(18, 2), PRIMARY KEY(ID) );
使用以下 INSERT 語句將值插入到此建立的表中:
INSERT INTO CUSTOMERS VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ), (2, 'Khilan', 25, 'Delhi', 1500.00 ), (3, 'Kaushik', 23, 'Kota', 2000.00 ), (4, 'Chaitali', 25, 'Mumbai', 6500.00 ), (5, 'Hardik', 27, 'Bhopal', 8500.00 ), (6, 'Komal', 22, 'MP', 4500.00 ), (7, 'Muffy', 24, 'Indore', 10000.00 );
建立另一個表
現在,讓我們建立一個另一個空表來儲存所有以前在“CUSTOMERS”主表中刪除的客戶。
CREATE TABLE OLD_CUSTOMERS ( ID INT NOT NULL, NAME VARCHAR(20) NOT NULL, AGE INT NOT NULL, ADDRESS VARCHAR(25), SALARY DECIMAL(18, 2), PRIMARY KEY(ID) );
使用以下 CREATE TRIGGER 語句,在 CUSTOMERS 表上建立一個新的觸發器“after_delete_trigger”,以從 CUSTOMERS 表中刪除客戶詳細資訊並將它們插入到另一個表“OLD_CUSTOMERS”中:
DELIMITER // CREATE TRIGGER after_delete_trigger AFTER DELETE ON CUSTOMERS FOR EACH ROW BEGIN INSERT INTO OLD_CUSTOMERS VALUES (OLD.ID, OLD.NAME, OLD.AGE, OLD.ADDRESS, OLD.SALARY); END // DELIMITER ;
使用下面顯示的常規 DELETE 語句從 CUSTOMERS 表中刪除“舊”客戶的詳細資訊:
DELETE FROM CUSTOMERS WHERE ID = 3;
驗證
要驗證詳細資訊是否已從 CUSTOMERS 表中刪除並新增到 OLD_CUSTOMERS 表中,讓我們嘗試使用 SELECT 查詢檢索它們的兩個結果集。
CUSTOMERS 表中的記錄如下:
ID | 姓名 | 年齡 | 地址 | 工資 |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Khilan | 25 | Delhi | 1500.00 |
4 | Chaitali | 25 | Mumbai | 6500.00 |
5 | Hardik | 27 | Bhopal | 8500.00 |
6 | Komal | 22 | Hyderabad | 4500.00 |
7 | Muffy | 24 | Indore | 10000.00 |
OLD_CUSTOMERS 表中的記錄如下:
ID | 姓名 | 年齡 | 地址 | 工資 |
---|---|---|---|---|
3 | Kaushik | 23 | Kota | 2000.00 |
如您在上面的表中看到的,資料已從 CUSTOMERS 表中刪除並新增到 OLD_CUSTOMERS 表中。但是,在應用程式級別上不可見的唯一區別是觸發器在刪除完成之後執行,而不是在 BEFORE DELETE 觸發器中執行。
使用客戶端程式的刪除後觸發器
我們還可以使用客戶端程式而不是 SQL 查詢來執行 After Delete 觸發器語句。
語法
要透過 PHP 程式執行 After Delete 觸發器,我們需要使用 mysqli 函式 query() 查詢 CREATE TRIGGER 語句,如下所示:
$sql = "CREATE TRIGGER after_delete_trigger AFTER DELETE ON CUSTOMERS FOR EACH ROW BEGIN INSERT INTO OLD_CUSTOMERS VALUES (OLD.ID, OLD.NAME, OLD.AGE, OLD.ADDRESS, OLD.SALARY); END"; $mysqli->query($sql);
要透過 JavaScript 程式執行 After Delete 觸發器,我們需要使用 mysql2 庫的 query() 函式查詢 CREATE TRIGGER 語句,如下所示:
sql = `CREATE TRIGGER after_delete_trigger AFTER DELETE ON CUSTOMERS FOR EACH ROW BEGIN INSERT INTO OLD_CUSTOMERS VALUES (OLD.ID, OLD.NAME, OLD.AGE, OLD.ADDRESS, OLD.SALARY); END`; con.query(sql);
要透過 Java 程式執行 After Delete 觸發器,我們需要使用 JDBC 函式 execute() 查詢 CREATE TRIGGER 語句,如下所示:
String sql = "CREATE TRIGGER after_delete_trigger AFTER DELETE ON CUSTOMERS FOR EACH ROW BEGIN INSERT INTO OLD_CUSTOMERS VALUES (OLD.ID, OLD.NAME, OLD.AGE, OLD.ADDRESS, OLD.SALARY); END"; statement.execute(sql);
要透過 python 程式執行 After Delete 觸發器,我們需要使用 MySQL Connector/Python 的 execute() 函式查詢 CREATE TRIGGER 語句,如下所示:
afterDelete_trigger_query = 'CREATE TRIGGER {trigger_name} AFTER DELETE ON {table_name} FOR EACH ROW BEGIN INSERT INTO {another_table} VALUES (OLD.ID, OLD.NAME, OLD.AGE, OLD.ADDRESS, OLD.SALARY); END' cursorObj.execute(afterDelete_trigger_query)
示例
以下是程式:
$dbhost = 'localhost'; $dbuser = 'root'; $dbpass = 'password'; $db = 'TUTORIALS'; $mysqli = new mysqli($dbhost, $dbuser, $dbpass, $db); if ($mysqli->connect_errno) { printf("Connect failed: %s
", $mysqli->connect_error); exit(); } //printf('Connected successfully.
'); $sql = "CREATE TRIGGER after_delete_trigger AFTER DELETE ON CUSTOMERS FOR EACH ROW BEGIN INSERT INTO OLD_CUSTOMERS VALUES (OLD.ID, OLD.NAME, OLD.AGE, OLD.ADDRESS, OLD.SALARY); END"; if ($mysqli->query($sql)) { printf("Trigger created successfully...!\n"); } $q = "DELETE FROM CUSTOMERS WHERE ID = 3"; $result = $mysqli->query($q); if ($result == true) { printf("Delete query executed successfully ...!\n"); } $q1 = "SELECT * FROM CUSTOMERS"; $res1 = $mysqli->query($q1); if ($res1->num_rows > 0) { printf("SELECT * FROM CUSTOMERS(verification): \n"); while ($r1 = $res1->fetch_assoc()) { printf( "Id %d, Name: %s, Age: %d, Address %s, Salary %f", $r1['ID'], $r1["NAME"], $r1['AGE'], $r1["ADDRESS"], $r1["SALARY"], ); printf("\n"); } } $q2 = "SELECT * FROM OLD_CUSTOMERS"; $res2 = $mysqli->query($q2); if ($res2->num_rows > 0) { printf("SELECT * FROM OLD_CUSTOMER(verification): \n"); while ($r1 = $res2->fetch_assoc()) { printf( "Id %d, Name: %s, Age: %d, Address %s, Salary %f", $r1['ID'], $r1["NAME"], $r1['AGE'], $r1["ADDRESS"], $r1["SALARY"], ); printf("\n"); } } if ($mysqli->error) { printf("Error message: ", $mysqli->error); } $mysqli->close();
輸出
獲得的輸出如下:
Trigger created successfully...! Delete query executed successfully ...! SELECT * FROM CUSTOMERS(verification): Id 1, Name: Ramesh, Age: 32, Address Ahmedabad, Salary 2000.000000 Id 2, Name: Khilan, Age: 25, Address Delhi, Salary 1500.000000 Id 4, Name: Chaitali, Age: 25, Address Mumbai, Salary 6500.000000 Id 5, Name: Hardik, Age: 27, Address Bhopal, Salary 8500.000000 Id 6, Name: Komal, Age: 22, Address MP, Salary 4500.000000 Id 7, Name: Muffy, Age: 24, Address Indore, Salary 10000.000000 SELECT * FROM OLD_CUSTOMER(verification): Id 3, Name: Kaushik, Age: 23, Address Kota, Salary 2000.000000
var mysql = require('mysql2'); var con = mysql.createConnection({ host:"localhost", user:"root", password:"password" }); //Connecting to MySQL con.connect(function(err) { if (err) throw err; //console.log("Connected successfully...!"); //console.log("--------------------------"); sql = "USE TUTORIALS"; con.query(sql); sql = `CREATE TRIGGER after_delete_trigger AFTER DELETE ON CUSTOMERS FOR EACH ROW BEGIN INSERT INTO OLD_CUSTOMERS VALUES (OLD.ID, OLD.NAME, OLD.AGE, OLD.ADDRESS, OLD.SALARY); END`; con.query(sql); console.log("After delete query executed successfully..!"); sql = "DELETE FROM CUSTOMERS WHERE ID = 3"; con.query(sql); console.log("Customers table records: ") sql = "SELECT * FROM CUSTOMERS"; con.query(sql, function(err, result){ if (err) throw err; console.log(result); console.log('---------------------------------'); console.log('OLD_CUSTOMERS table records: ') }); sql = "SELECT * FROM OLD_CUSTOMERS"; con.query(sql, function(err, result){ if (err) throw err; console.log(result); }); });
輸出
生成的輸出如下:
After delete query executed successfully..! Customers table records: [ { ID: 1, NAME: 'Ramesh', AGE: 32, ADDRESS: 'Ahmedabad', SALARY: '2000.00' }, { ID: 2, NAME: 'Khilan', AGE: 25, ADDRESS: 'Delhi', SALARY: '1500.00' }, { ID: 4, NAME: 'Chaitali', AGE: 25, ADDRESS: 'Mumbai', SALARY: '6500.00' }, { ID: 5, NAME: 'Hardik', AGE: 27, ADDRESS: 'Bhopal', SALARY: '8500.00' }, { ID: 6, NAME: 'Komal', AGE: 22, ADDRESS: 'MP', SALARY: '4500.00' }, { ID: 7, NAME: 'Muffy', AGE: 24, ADDRESS: 'Indore', SALARY: '10000.00' } ] --------------------------------- OLD_CUSTOMERS table records: [ { ID: 3, NAME: 'Kaushik', AGE: 23, ADDRESS: 'Kota', SALARY: '2000.00' } ]
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class AfterDeleteTrigger { public static void main(String[] args) { String url = "jdbc:mysql://:3306/TUTORIALS"; String user = "root"; String password = "password"; ResultSet rs; try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection con = DriverManager.getConnection(url, user, password); Statement st = con.createStatement(); //System.out.println("Database connected successfully...!"); //create table String sql = "CREATE TABLE CUSTOMERS (ID INT NOT NULL, NAME VARCHAR(20) NOT NULL, AGE INT NOT NULL, ADDRESS VARCHAR(25), SALARY DECIMAL(18, 2), PRIMARY KEY(ID))"; st.execute(sql); System.out.println("Customers table created successfully...!"); //lets insert some records into customers table String sql1 = "INSERT INTO CUSTOMERS VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ), (2, 'Khilan', 25, 'Delhi', 1500.00 ), (3, 'Kaushik', 23, 'Kota', 2000.00 ), (4, 'Chaitali', 25, 'Mumbai', 6500.00 ), (5, 'Hardik', 27, 'Bhopal', 8500.00 ), (6, 'Komal', 22, 'MP', 4500.00 ), (7, 'Muffy', 24, 'Indore', 10000.00 )"; st.execute(sql1); System.out.println("Records inserted successfully...!"); //print table records String sql2 = "SELECT * FROM CUSTOMERS"; rs = st.executeQuery(sql2); System.out.println("Customers table records: "); while(rs.next()) { String id = rs.getString("id"); String name = rs.getString("name"); String age = rs.getString("age"); String address = rs.getString("address"); String salary = rs.getString("salary"); System.out.println("Id: " + id + ", Name: " + name + ", Age: " + age + ", Address: " + address + ", Salary: " + salary); } //let create one more table named Old_customers String sql3 = "CREATE TABLE OLD_CUSTOMERS (ID INT NOT NULL, NAME VARCHAR(20) NOT NULL, AGE INT NOT NULL, ADDRESS VARCHAR(25), SALARY DECIMAL(18, 2), PRIMARY KEY(ID))"; st.execute(sql3); System.out.println("OLD_CUSTOMERS table created successully...!"); //print the records String sql4 = "SELECT * FROM OLD_CUSTOMERS"; rs = st.executeQuery(sql4); System.out.println("OLD_CUSTOMERS table records before delete trigger: "); while(rs.next()) { String id = rs.getString("id"); String name = rs.getString("name"); String age = rs.getString("age"); String address = rs.getString("address"); String salary = rs.getString("salary"); System.out.println("Id: " + id + ", Name: " + name + ", Age: " + age + ", Address: " + address + ", Salary: " + salary); } //lets create trigger on student table String sql5 = "CREATE TRIGGER after_delete_trigger AFTER DELETE ON CUSTOMERS FOR EACH ROW BEGIN INSERT INTO OLD_CUSTOMERS VALUES (OLD.ID, OLD.NAME, OLD.AGE, OLD.ADDRESS, OLD.SALARY); END"; st.execute(sql5); System.out.println("Triggerd Created successfully...!"); //lets delete one record from customers table; String d_sql = "DELETE FROM CUSTOMERS WHERE ID = 3"; st.execute(d_sql); System.out.println("Record with id = 3 deleted successfully....!"); //let print OLD_CUSTOMERS table records String sql6 = "SELECT * FROM OLD_CUSTOMERS"; rs = st.executeQuery(sql6); System.out.println("OLD_CUSTOMERS records: "); while(rs.next()) { String id = rs.getString("id"); String name = rs.getString("name"); String age = rs.getString("age"); String address = rs.getString("address"); String salary = rs.getString("salary"); System.out.println("Id: " + id + ", Name: " + name + ", Age: " + age + ", Address: " + address + ", Salary: " + salary); } }catch(Exception e) { e.printStackTrace(); } } }
輸出
獲得的輸出如下所示:
Customers table created successfully...! Records inserted successfully...! Customers table records: Id: 1, Name: Ramesh, Age: 32, Address: Ahmedabad, Salary: 2000.00 Id: 2, Name: Khilan, Age: 25, Address: Delhi, Salary: 1500.00 Id: 3, Name: Kaushik, Age: 23, Address: Kota, Salary: 2000.00 Id: 4, Name: Chaitali, Age: 25, Address: Mumbai, Salary: 6500.00 Id: 5, Name: Hardik, Age: 27, Address: Bhopal, Salary: 8500.00 Id: 6, Name: Komal, Age: 22, Address: MP, Salary: 4500.00 Id: 7, Name: Muffy, Age: 24, Address: Indore, Salary: 10000.00 OLD_CUSTOMERS table created successully...! OLD_CUSTOMERS table records before delete trigger: Triggerd Created successfully...! Record with id = 3 deleted successfully....! OLD_CUSTOMERS records: Id: 3, Name: Kaushik, Age: 23, Address: Kota, Salary: 2000.00
import mysql.connector # Establishing the connection connection = mysql.connector.connect( host='localhost', user='root', password='password', database='tut' ) # Creating a cursor object cursorObj = connection.cursor() table_name = 'Customers' another_table = 'OLD_CUSTOMERS' trigger_name = 'after_delete_trigger' afterDelete_trigger_query = f''' CREATE TRIGGER {trigger_name} AFTER DELETE ON {table_name} FOR EACH ROW BEGIN INSERT INTO {another_table} VALUES (OLD.ID, OLD.NAME, OLD.AGE, OLD.ADDRESS, OLD.SALARY); END ''' cursorObj.execute(afterDelete_trigger_query) print(f"AFTER DELETE Trigger '{trigger_name}' is created successfully.") connection.commit() # Delete details of old customer delete_query = "DELETE FROM Customers WHERE ID = 3;" cursorObj.execute(delete_query) print("Delete query executed successfully.") # close the cursor and connection connection.commit() cursorObj.close() connection.close()
輸出
以下是上述程式碼的輸出:
AFTER DELETE Trigger 'after_delete_trigger' is created successfully. Delete query executed successfully.