變量
系統變量:MySQL內置變量
#查看所有系統變量
show variables \G;
#通過模糊查詢篩選變量
show variables like “%path%”;
全局變量:在所有終端中都生效;
會話變量:在當前會話(本次登錄);
#可以通過set變量
臨時修改全局變量(需權限)
set global max_connections = 200; 調整最大連接數為200
select @@max_connections;
臨時修改會話變量(當前連接生效)
set session wait timeout = 3600; 調整超時時間為1小時
用戶變量:用于臨時存儲,用戶自己的數據,例如:Selectd的查詢結果。
#用戶變量,臨時存儲查詢的結果
select username into @user name from users where id=1;
#也可以進行一些運算,被函數調用
局部變量:在存儲過程內部定義變量,只在該存儲過程內部有效。
觸發器
觸發器(Triggers)是當某個表在進行(update\insert\deletc)操作時,自動同步進行的關聯操作。
例如:在對A表insert一條新的數據,B表會同步記錄日志。
特性:確保數據的完整性,日志記錄,數據校驗等操作。
觸發器類型 | NEW 和 OLD的使用 |
INSERT 型觸發器 | NEW 表示將要或者已經新增的數據 |
UPDATE 型觸發器 | OLD 表示修改之前的數據 , NEW 表示將要或已經修改后的數據 |
DELETE 型觸發器 | OLD 表示將要或者已經刪除的數據 |
觸發器注意事項
1.性能影響:觸發器會在每次相關事件發生時自動執行,這可能會對性能產生影響,特別是當觸發器邏輯復雜或者表中數據量很大時。
2.調試困難:觸發器的錯誤可能不易察覺,調試時需要特別注意。
3.遞歸觸發:觸發器中的操作可能會導致觸發器的遞歸調用,需要避免這種情況,以免導致無限循環。
觸發器六種執行時間和事件
1. BEFORE INSERT
執行時間:在插入操作發生之前。
作用:允許你在數據插入之前修改數據,或對插入操作進行驗證。
2. AFTER INSERT
執行時間:在插入操作發生之后。
作用:可以在數據插入后執行額外的操作,如更新其他表、記錄日志等。
3. BEFORE UPDATE
執行時間:在更新操作發生之前。
作用:允許你在數據更新之前對數據進行校驗或修改。
4. AFTER UPDATE
執行時間:在更新操作發生之后。
作用:用于在數據更新之后執行一些后續操作,比如同步其他表的數據或執行計算。
5. BEFORE DELETE
執行時間:在刪除操作發生之前。
作用:允許你在數據刪除之前進行某些檢查或處理,例如備份刪除的數據或記錄日志。
6. AFTER DELETE
執行時間:在刪除操作發生之后。
作用:用于在數據刪除之后執行一些操作,如清理相關數據或通知系統其他部分。
觸發器的執行順序
BEFORE INSERT 觸發器在 AFTER INSERT 觸發器之前執行。
BEFORE UPDATE 觸發器在 AFTER UPDATE 觸發器之前執行。
BEFORE DELETE 觸發器在 AFTER DELETE 觸發器之前執行。
語法結構
1.創建觸發器
create trigger trigger_name
before/after insert/update/delete
on tbl_name
[ for each row ] ?-- 行級觸發器
begin
????trigger_stmt ;
end;
2.刪除觸發器
drop trigger [schema_name.]trigger_name
3.查看觸發器
show triggers ;
操作步驟
假設我們有一個員工表 employees 和一個日志表 employee_log。每當有新的員工被插入到 employees 表時,我們希望在 employee_log 表中記錄這次插入的操作。
1.創建表
(1)創建 employees 表
CREATE TABLE employees (
????id INT AUTO_INCREMENT PRIMARY KEY,
????name VARCHAR(100) NOT NULL,
????position VARCHAR(100),
????salary DECIMAL(10, 2)
);
(2)創建 employee_log 表
CREATE TABLE employee_log (
????log_id INT AUTO_INCREMENT PRIMARY KEY,
????action_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
????action_type VARCHAR(50),
????employee_id INT,
????employee_name VARCHAR(100),
????employee_position VARCHAR(100),
????employee_salary DECIMAL(10, 2)
);
2.創建插入觸發器
DELIMITER //
CREATE TRIGGER after_employee_insert
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
????INSERT INTO employee_log (action_type, employee_id, employee_name, employee_position, employee_salary)
????VALUES ('INSERT', NEW.id, NEW.name, NEW.position, NEW.salary);
END;
//
DELIMITER ;
存儲過程
將一條或多條復雜的SQL語句,包含在存儲過程中,存放在服務。
客戶端使用call存儲過程名;執行該存儲過程;
優點:簡化客戶端的SQL編寫,減少網絡發送的數據量,加速執行,提高效率。
缺點:但在可移植性、調試、資源占用等方面存在不足。
存儲過程適合用于處理數據庫端的復雜、高頻復用的業務邏輯,能提升性能和安全性;但在可移植性、調試、資源占用等方面存在不足。實際使用中需根據具體場景權衡,避免過度依賴或完全摒棄。
函數
對數據進行簡單處理,例如:求和、平均值、最大值、最小值、文本處理,獲取時間等…,函數有返回值。
使用select 函數名(參數) …;
MySQL內置
MySQL自定義函數