MySQL 存储的函数无法使用 MODIFIES SQL DATA 进行编译

MySQL stored function won't compile with MODIFIES SQL DATA

如果我在 MySQL 中编译下面的存储函数(使用 MySQL Workbench 8.0),我得到消息:

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

但是,如果我将 MODIFIES SQL DATA 更改为 READS SQL DATA,该函数编译正常。 MySQL manual 表示:

MODIFIES SQL DATA indicates that the routine contains statements that may write data (for example, INSERT or DELETE).

那么为什么 MODIFIES SQL DATA 不被接受?我知道这些特征是 "advisory only",但我仍然想使用正确的特征。

CREATE FUNCTION DoSomething(employeeName VARCHAR(30)) RETURNS int(11)
    MODIFIES SQL DATA
BEGIN
   DECLARE income INT;

   SELECT Salary
   INTO income
   FROM Employee
   WHERE Name = employeeName;

   UPDATE Employee
   SET Salary = 300
   WHERE Name = employeeName;

   IF income < 5000 THEN
      RETURN 0;
   ELSE
      RETURN (income - 5000) * 0.1;
   END IF;
END

在 MySQL 8.0.19 和 Workbench 中,使用 DETERMINISTIC

就足够了

编辑:

为了澄清,函数选项如 DETERMINISTIC、NO SQL 或 READS SQL DATA 不会决定任何事情,它仅表示您已就其安全性做出决定。 没有 SQL 或 READS SQL DATA 的函数清楚地告诉 MySQL 内部没有数据操作并且它们是安全的。

通过使用 DETERMINISTIC,您告诉 mysql 运行 这个函数是安全的,它在内部操作数据..

参见 mysql explanation,内容为:

By default, for a CREATE FUNCTION statement to be accepted, at least one of DETERMINISTIC, NO SQL, or READS SQL DATA must be specified explicitly.

CREATE DEFINER=`root`@`localhost` FUNCTION `DoSomething`(employeeName VARCHAR(30)) RETURNS int
    DETERMINISTIC
BEGIN
   DECLARE income INT;

   SELECT Salary
   INTO income
   FROM Employee
   WHERE Name = employeeName;

   UPDATE Employee
   SET Salary = 300
   WHERE Name = employeeName;

   IF income < 5000 THEN
      RETURN 0;
   ELSE
      RETURN (income - 5000) * 0.1;
   END IF;
END

更新员工