
- 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 - INSERT 查詢
- MySQL - SELECT 查詢
- MySQL - UPDATE 查詢
- MySQL - DELETE 查詢
- MySQL - REPLACE 查詢
- MySQL - INSERT IGNORE
- MySQL - INSERT ON DUPLICATE KEY UPDATE
- MySQL - INSERT INTO SELECT
- 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 vs 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 - DELETE JOIN
- MySQL - UPDATE JOIN
- MySQL - UNION vs 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 - SIGNAL
- MySQL - RESIGNAL
- 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 中刪除之前觸發器的語法:
CREATE TRIGGER trigger_name BEFORE DELETE ON table_name FOR EACH ROW BEGIN -- trigger body END;
示例
在此示例中,我們建立一個名為“CUSTOMERS”的表來演示其上的刪除之前觸發器,使用以下查詢:
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 表上建立一個新的觸發器“before_delete_trigger”,以便從 CUSTOMERS 表中刪除客戶詳細資訊並將它們插入到另一個表“OLD_CUSTOMERS”中:
DELIMITER // CREATE TRIGGER before_delete_trigger BEFORE 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 語句刪除“舊”客戶的詳細資訊:
DELETE FROM CUSTOMERS WHERE ID = 3;
驗證
為了驗證詳細資訊是否已從 OCUSTOMERS 表中刪除並新增到 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 表中。
使用客戶端程式的刪除之前觸發器
我們還可以使用客戶端程式而不是 SQL 查詢來執行刪除之前觸發器語句。
語法
要透過 PHP 程式執行刪除之前觸發器,我們需要使用 **mysqli** 函式 **query()** 查詢 CREATE TRIGGER 語句,如下所示:
$sql = "CREATE TRIGGER before_delete_trigger BEFORE 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 程式執行刪除之前觸發器,我們需要使用 **mysql2** 庫的 **query()** 函式查詢 CREATE TRIGGER 語句,如下所示:
sql = `CREATE TRIGGER before_delete_trigger BEFORE 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程式執行Before Delete觸發器,我們需要使用**JDBC**函式**execute()**查詢CREATE TRIGGER語句,如下所示:
String sql = "CREATE TRIGGER before_delete_trigger BEFORE 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程式執行Before Delete觸發器,我們需要使用**MySQL Connector/Python**的**execute()**函式查詢CREATE TRIGGER語句,如下所示:
beforeDelete_trigger_query = 'CREATE TRIGGER {trigger_name} BEFORE 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(beforeDelete_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 before_delete_trigger BEFORE 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 before_delete_trigger BEFORE 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("Before delete query executed successfully..!"); sql = "DELETE FROM CUSTOMERS WHERE ID = 3"; console.log("Delete query executed successfully...!"); 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..! 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 BeforeDeleteTrigger { 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 before_delete_trigger BEFORE 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 = 'before_delete_trigger' beforeDelete_trigger_query = f''' CREATE TRIGGER {trigger_name} BEFORE 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(beforeDelete_trigger_query) print(f"BEFORE 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()
輸出
以上程式碼的輸出如下:
BEFORE DELETE Trigger 'before_delete_trigger' is created successfully. Delete query executed successfully.