首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MySQL 視圖插入數據限制與多表同步寫入:觸發器/存儲過程方案

     編輯:程式設計綜合問答

視圖插入限制

MySQL 視圖**可插入**需滿足:

  • 視圖定義不含聚合函數 (`SUM`/`COUNT`)、`DISTINCT`、`GROUP BY`、`UNION`、子查詢、`JOIN` 導致歧義列。
  • 視圖列一一映射底表列,無衍生列(表達式、常量)。
  • 底表無 `NOT NULL` 且無默認值的列被視圖省略。

不滿足時插入報錯:`View 'xxx' is not updatable`。

多表同步寫入方案

方案一:存儲過程(推薦)

CREATE PROCEDURE sp_insert_teacher_class(
    IN t_name VARCHAR(50), IN c_name VARCHAR(50)
)
BEGIN
    DECLARE t_id INT;
    INSERT INTO Teacher(name) VALUES (t_name);
    SET t_id = LAST_INSERT_ID();
    INSERT INTO Class(name, teacher_id) VALUES (c_name, t_id);
    UPDATE Teacher SET class_id = LAST_INSERT_ID() WHERE id = t_id;
END;

方案二:觸發器

CREATE TRIGGER trg_class_after_insert
AFTER INSERT ON Class FOR EACH ROW
BEGIN
    UPDATE Teacher SET class_id = NEW.id WHERE id = NEW.teacher_id;
END;

選型建議

  • 業務邏輯複雜、需事務控制 → **存儲過程**(應用層調用單點)。
  • 單純同步外鍵回填 → **觸發器**(透明、不可繞過)。
  • 避免在應用代碼中手動執行多條 SQL,易出現一致性問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved