目錄
一、mysql的存儲過程介紹
二、. 創建存儲過程
1、準備
2、創建插入記錄的存儲過程
三. 調用存儲過程
四. 刪除存儲過程
五. 修改存儲過程,避免數據表的姓名出現重復
1、修改存儲過程的方式
2、重新創建存儲過程
六. 驗證新的存儲過程
1、插入新的記錄
2、插入名稱相同的記錄
(1)直接調用存儲過程插入名稱相同的記錄
(2)只對記錄名進行修改
一、mysql的存儲過程介紹
????????MySQL的存儲過程是一組為了完成特定功能的SQL語句集合,它被編譯并存儲在數據庫中,可被數據庫的客戶端程序反復調用。存儲過程由SQL語句組成,包括聲明、SQL語句、控制結構以及異常處理等。存儲過程可以提高SQL代碼的重用性,減少網絡通信量,提高性能,并允許數據庫管理員和開發人員在數據庫層面上實施復雜的業務邏輯。
????????類似于系統的shell腳本,或者編程語言中的函數等。
二、. 創建存儲過程
1、準備
????????假設我們有一個名為`trainees`的表,并且我們想要創建一個存儲過程來插入一個新的學員記錄。
????????首先,確保`trainees`表存在,并且有一個合適的結構。例如:
CREATE TABLE trainees (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,age INT,grade VARCHAR(10)
);
? ? ? ? 接著,在navicat中實際操作,效果如下圖所示:
? ? ? ? 最后,查看表是否存在,操作如下圖示:
2、創建插入記錄的存儲過程
????????確認數據表存在后,我們可以創建一個存儲過程來插入新的學員記錄:
DELIMITER //
CREATE PROCEDURE InsertTrainee(IN p_name VARCHAR(50), IN p_age INT, IN p_grade VARCHAR(10))BEGININSERT INTO trainees (name, age, grade) VALUES (p_name, p_age, p_grade);SELECT 'New trainee inserted successfully!';
END //
DELIMITER ;
????????在這個例子中,我們使用了`DELIMITER`來改變命令提示符,以便在存儲過程中使用多個語句。`InsertTrainee`是存儲過程的名稱,它接受三個輸入參數:`p_name`、`p_age`和`p_grade`。
????????在存儲過程的主體中,我們使用這些參數來插入一個新的學員記錄,并返回一個消息確認插入成功。
????????實際操作如下圖所示:
?????? 接著,可以在navicat中查看數據庫的“函數”選項,選中“InsertTrainee”,如下圖示,表明存儲過程正確的創建好了。
三. 調用存儲過程
????????一旦創建了存儲過程,就可以通過指定存儲過程名和參數(如果有的話)來調用它。以下是如何調用上面創建的`InsertTrainee`存儲過程的例子:
????????CALL InsertTrainee('John Doe', 20, 'A');
????????這將在`trainees`表中插入一個新的學員記錄,并返回一條消息確認插入成功。
????????在navicat中查看數據表,如下圖所示:
????????可以看出,數據記錄插入成功。
四. 刪除存儲過程
如果不再需要某個存儲過程,可以使用`DROP PROCEDURE`語句來刪除它:
????????DROP PROCEDURE IF EXISTS InsertTrainee;
????????這將會刪除名為`InsertTrainee`的存儲過程(如果存在的話)。使用`IF EXISTS`子句可以防止在存儲過程不存在時產生錯誤。
五. 修改存儲過程,避免數據表的姓名出現重復
1、修改存儲過程的方式
????????如果需要修改存儲過程,可以使用`ALTER PROCEDURE`語句。但是,請注意,直接修改存儲過程可能會導致意外的副作用。通常,更好的做法是先刪除舊的存儲過程,然后創建一個新的。以下是如何刪除和重新創建存儲過程的例子:
-- 刪除存儲過程
DROP PROCEDURE IF EXISTS InsertTrainee;
? ? ? ? 實際操作如下:
2、重新創建存儲過程
? ? ? ? 重新編寫存儲過程如下:
-- 重新創建存儲過程(假設想要修改它)
DELIMITER //
CREATE PROCEDURE InsertTrainee(IN p_name VARCHAR(50), IN p_age INT, IN p_grade VARCHAR(10))
BEGIN-- 假設我們添加了一些額外的邏輯DECLARE trainee_exists INT;SELECT COUNT(*) INTO trainee_exists FROM trainees WHERE name = p_name;IF trainee_exists = 0 THENINSERT INTO trainees (name, age, grade) VALUES (p_name, p_age, p_grade);SELECT 'New trainee inserted successfully!';ELSESELECT 'Trainee with the same name already exists.';END IF;
END //
DELIMITER ;
????????這樣,我們修改存儲過程的代碼,也就是添加了一些額外的邏輯來檢查是否已經存在具有相同姓名的學員。
????????若不存在,直接添加記錄;若已經存在,提示“... the same name already exists.”,不做任何添加。
?????? 接著,可以在navicat中查看數據庫的“函數”選項,選中“InsertTrainee”,如下圖示,表明新的存儲過程正確的創建好了。
六. 驗證新的存儲過程
1、插入新的記錄
結果1提示插入成功,然后在navicat中輸入select語句查詢數據表,結果如下:
可以看出,新的記錄插入成功完成。
2、插入名稱相同的記錄
(1)直接調用存儲過程插入名稱相同的記錄
????????直接調用存儲過程插入名稱相同的記錄,但是其他字段不同的記錄,如下所示:
????????結果1顯示:Trainee with the same name already exists.說明有同名的記錄存在。
????????顯然插入記錄沒有成功。
(2)只對記錄名進行修改
????????最對新的記錄名字修改,其他不改動,操作如下圖所示:
結果1顯示:新的記錄插入成功。
查看目前表中記錄,如下圖所示,新的記錄已經存在,顯然重新插入新的記錄成功。
文章正下方可以看到我的聯系方式:鼠標“點擊”?下面的?“威迪斯特-就是video system?微信名片”字樣,就會出現我的二維碼,歡迎溝通探討。