首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 事務、視圖、存儲過程、函數、觸發器完整語法手冊

     編輯:MySQL 資料庫相關知識

事務控制

基礎語法

-- 修改表引擎支援事務
ALTER TABLE a ENGINE=InnoDB;

-- 顯式事務
BEGIN;                    -- 或 START TRANSACTION
SET autocommit=0;         -- 關閉自動提交

UPDATE bank SET money=money-100 WHERE bid=1;
UPDATE bank SET money=money+100 WHERE bid=2;

COMMIT;                   -- 提交
-- ROLLBACK;              -- 回滾

PDO 事務實戰模板

try {
    $pdo = new PDO("mysql:host=127.0.0.1;dbname=c58", 'root', '');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->query("SET NAMES utf8");
    
    $pdo->beginTransaction();
    $pdo->exec('UPDATE bank SET money=money-100 WHERE bid=1');
    $pdo->exec('UPDATE bank SET money=money+100 WHERE bid=2');
    $pdo->commit();
} catch (PDOException $e) {
    $pdo->rollBack();
    error_log($e->getMessage());
}

視圖管理

-- 創建
CREATE VIEW bankview AS SELECT bid, bname FROM bank;

-- 查看
SHOW TABLE STATUS WHERE Comment='VIEW';

-- 修改
ALTER VIEW bankview AS SELECT bid FROM bank;

-- 刪除
DROP VIEW bankview;

存儲過程

基礎語法與分隔符

DELIMITER $$

CREATE PROCEDURE get_bid(INOUT n CHAR(20) CHARSET utf8)
BEGIN
    SELECT bid FROM bank WHERE name = n;
END $$

DELIMITER ;

參數模式詳解

模式特徵用途
IN輸入參數,內部修改不影響外部傳入查詢條件
OUT輸出參數,初始為 NULL,內部賦值返回返回計算結果
INOUT雙向,可輸入亦可輸出累加器、狀態傳遞

實戰:級聯刪除存儲過程

DELIMITER $$

CREATE PROCEDURE del_class(INOUT cid SMALLINT)
BEGIN
    DELETE FROM class WHERE cid = cid;
    DELETE FROM stu WHERE cid = cid;
END $$

DELIMITER ;

-- 調用
SET @id = 1;
CALL del_class(@id);

管理命令

SHOW PROCEDURE STATUS;
DROP PROCEDURE get_bid;

存儲函數

DELIMITER $$

CREATE FUNCTION hello(s CHAR(20) CHARSET utf8) 
RETURNS CHAR(50) 
READS SQL DATA
BEGIN
    RETURN CONCAT('hello ', s, '!');
END $$

DELIMITER ;

-- 調用 (可直接在 SQL 中使用)
SELECT hello('hdw');
SELECT cname FROM class WHERE cid = getcid('小貓');
函數特性:READS SQL DATA 聲明只讀數據,DETERMINISTIC 聲明確定性結果,二選一即可避開 binlog 限制。

觸發器

語法結構

CREATE TRIGGER trigger_name
{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON table_name
FOR EACH ROW
BEGIN
    -- 觸發邏輯
END;

實戰案例

1. 級聯刪除觸發器

CREATE TRIGGER del_class_stu
AFTER DELETE ON class
FOR EACH ROW
BEGIN
    DELETE FROM stu WHERE cid = OLD.cid;
END;

2. 插入時自動填充默認值

CREATE TRIGGER set_defaults
BEFORE INSERT ON article
FOR EACH ROW
BEGIN
    IF NEW.author IS NULL THEN SET NEW.author = '123網'; END IF;
    IF NEW.pub_time IS NULL THEN SET NEW.pub_time = UNIX_TIMESTAMP(NOW()); END IF;
END;

查看現有觸發器

SHOW TRIGGERS;

總結對比表

對象觸發方式典型場景事務行為
事務顯式 BEGIN/COMMIT多表一致性操作ACID 完整支援
視圖查詢時動態執行簡化複雜查詢、權限隔離不存儲數據
存儲過程CALL 顯式調用業務邏輯封裝、批量處理可包含事務控制
函數SQL 表達式中調用計算、轉換、格式化不支援顯式事務
觸發器DML 事件自動觸發審計、同步、約束檢查屬於觸發語句事務一部分

最佳實踐建議

  • 業務邏輯優先放應用層,資料庫層僅做數據完約束
  • 觸發器慎用,隱式邏輯難以排查,建議文檔化管理
  • 存儲過程/函數務必聲明 DETERMINISTIC 或 READS SQL DATA 避免主從同步報錯
  • 定期 SHOW PROCEDURE/FUNCTION STATUS 清理廢棄對象
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved