首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 儲存過程參數命名禁忌:不可與欄位名同名

     編輯:MySQL 綜合教學

血淚教訓

儲存過程參數名若與表欄位名相同,參數值會被欄位值覆蓋,導致邏輯錯誤甚至誤刪全表資料。

錯誤示範

CREATE PROCEDURE sp_delete_species(
    IN species_id INT,          -- 參數名 = 欄位名
    OUT out_rows INT
)
BEGIN
    DELETE FROM `sample` WHERE `species_ID` = species_id;  -- species_id 解析為欄位,非參數!
    DELETE FROM `filepath` WHERE `species_ID` = species_id;
    DELETE FROM `species` WHERE `species_ID` = species_id;
    SET out_rows = ROW_COUNT();
END;

結果:species_id 在 WHERE 中被解析為表欄位,條件恆為真(欄位=自身),導致三表全表刪除。

正確寫法:參數加前綴

CREATE PROCEDURE sp_delete_species(
    IN p_species_id INT,        -- 參數前綴 p_
    OUT p_out_rows INT
)
BEGIN
    DELETE FROM `sample` WHERE `species_ID` = p_species_id;
    DELETE FROM `filepath` WHERE `species_ID` = p_species_id;
    DELETE FROM `species` WHERE `species_ID` = p_species_id;
    SET p_out_rows = ROW_COUNT();
END;

命名規範建議

物件前綴範例
輸入參數p_p_user_id, p_start_date
輸出參數o_ / p_out_o_total_count
輸入輸出參數pio_pio_status
區域變數v_v_row_count, v_flag
游標cur_cur_user_list
條件處理器h_h_not_found

MySQL 名稱解析優先順序

  1. 區域變數 / 參數
  2. 表欄位
  3. 系統/會話變數

雖然參數優先級理論高於欄位,但在某些上下文(如 WHERE 子句未限定表別名)會產生歧義,強制加前綴是唯一保險做法。

靜態分析工具

  • pt-query-digest --review 可掃描出潛在命名衝突
  • IDE(DataGrip、MySQL Workbench)語法高亮提示
  • Code Review 強制檢查參數命名規範
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved