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
更新员工
如果我在 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
更新员工