萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 匯入 SQL 觸發 ERROR 1418 錯誤的兩種解決方案

錯誤場景

匯入包含建立函數/預存程序的 SQL 檔案時,報錯:

ERROR 1418 (HY000) at line 8752: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled...

原因分析

開啟二進制日誌(log_bin)時,MySQL 要求建立的函數/程序必須宣告以下特性之一,以確保複寫安全:

  • DETERMINISTIC:相同輸入必產生相同輸出
  • NO SQL:不包含 SQL 語句
  • READS SQL DATA:只讀取資料不修改
  • MODIFIES SQL DATA:會修改資料(需搭配 log_bin_trust_function_creators)

方案一:全域變數放寬限制(快速生效,重啟失效)

SET GLOBAL log_bin_trust_function_creators = 1;

方案二:配置檔永久生效(需重啟 MySQL)

編輯 my.cnf(Linux)或 my.ini(Windows),在 [mysqld] 區段新增:

log_bin_trust_function_creators = 1

重啟服務:systemctl restart mysqld 或 service mysql restart。

方案三:修改函數定義(最規範,推薦)

在建立函數/程序時顯式宣告特性:

CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`()
DETERMINISTIC
BEGIN
    -- Routine body goes here...
END;

或針對唯讀函數:

CREATE FUNCTION `MyFunc`() RETURNS INT
READS SQL DATA
BEGIN
    RETURN 1;
END;

總結建議

  • 開發/測試環境:方案一或二最快。
  • 生產環境:優先方案三,明確宣告函數特性,保障複寫一致性。
  • 若無法修改 SQL 檔(第三方產品),只能採用方案二永久開啟信任。
copyright © 萬盛學電腦網 all rights reserved