-- 修改表引擎支援事務 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; -- 回滾
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 清理廢棄對象