MySQL 提供了數種進階功能來擴展資料庫的邏輯處理能力,其中 Trigger(觸發器)、Stored Function(儲存函式) 與 Stored Procedure(儲存程序) 是三種常用的工具,分別用於不同的情境,讓資料庫更具靈活性與自動化能力。
這篇的重點要談到以下幾個 : (1)資料表單設計的一些實務程序。 (2)資料欄位中代碼的設計。 (3)資料表單中外鍵約束的例外。 (4)資料表單有時需要違反正規化。 (5)資料表單中有時還是需要必要的冗餘資料。 在前面 這篇 已經談過將實體表單轉換為資料庫表單,但是並沒有說明過程。這篇來說明一下過程,並且再修正一下之前的答案。 要把紙面資料電子化,先把紙面資料的欄位整理出來,然後再看各欄位適合放在哪些資料表單中。我們從上面「出貨單」,看到以下的資訊 : (1) 公司資訊 (公司名稱、電話、傳真、地址) (2) 客戶資訊 (客戶名稱、電話、傳真、送貨地址) (3) 出貨日期、出貨單號 (4) 產品資訊 (產品編號、品名及規格、數量、單價、金額、備註) (5) 經手人資訊 (助理、業務) (6) 備註 (7) 簽收資訊 (簽收狀態、誰簽收、簽收日期) 通常「出貨單」資料都會從「訂單」資料轉過來,因此之前文章產生以下表單 客戶資料表 customer(cusno, cusname, cuszipcode, cusaddress, custel, cusfax, cuscontact) 職員資料表 employee(empno, empname, deptno, emptitle) 公…
這個練習是從前面的練習延伸而來 : 實作練習 : PHP + Stored Procedure + Stored Function + Trigger 實作練習 : PHP + Stored Procedure + Stored Function + Trigger(二) 第一個練習在建立訂單時沒有檢查庫存;第二個練習加入「檢查庫存」,但是當庫存不足時,並不方便檢查,也不方便完成後續處理。 因此這篇文章要開始來探討,有哪些地方需要修改? 才能讓無法完成的訂購順利完成? 我們先看看原有資料表單 : -- 產品資料表 CREATE TABLE Products ( ProductID INT AUTO_INCREMENT PRIMARY KEY, ProductName VARCHAR(100) NOT NULL, Price DECIMAL(10, 2) NOT NULL, Stock INT NOT NULL ); -- 訂單資料表 CREATE TABLE Orders ( OrderID INT AUTO_INCREMENT PRIMARY KEY, OrderDate DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, Custo…
在這篇" 實作練習 : PHP + Stored Procedure + Stored Function + Trigger "中,練習了使用Trigger/Stored Function/Stored Procedure並在PHP實現,但是因為在新增訂單時並沒有檢查庫存,因此必須再進一步來更新相關邏輯。 前面的練習已經實現了 : (1) 建立 Trigger 可以自動減去訂單數量,用來維護庫存量; (2) 建立 Stored Procedure 用來建立訂單; (3) 建立 Trigger 用來記錄建立訂單的log; (4) 建立 Stored Function 用來計算訂單總額; (5) 以php呼叫Stored Procedure 以介面來輸入訂單資料。 檢查庫存的邏輯應該寫在哪個地方? 目前有兩個觸發器 : UpdateStockAfterOrder 及 LogOrderAfterInsert 預存程序 CreateOrder 及 預存函式 CalculateOrderTotal 比較有可能的是 UpdateStockAfterOrder 與 CreateOrder 以下是觸發器UpdateStockAfterOrder DELIMITER // …