MySQL存储函数不会使用修改的SQL数据进行编译
如果我使用MySQL Workbench 8.0在MySQL中编译下面的存储函数,我会得到以下消息: 错误1418:此函数没有确定性、SQL或读取 已启用声明和二进制日志中的SQL数据 但是,如果我将修改SQL数据更改为读取SQL数据,则该函数的编译效果很好。报告说: MODIFIES SQL DATA指示例程包含以下语句: 可以写入数据,例如,插入或删除 那么为什么不接受修改SQL数据呢?我知道这些特性只是建议性的,但我仍然希望使用正确的特性MySQL存储函数不会使用修改的SQL数据进行编译,mysql,mysql-workbench,Mysql,Mysql Workbench,如果我使用MySQL Workbench 8.0在MySQL中编译下面的存储函数,我会得到以下消息: 错误1418:此函数没有确定性、SQL或读取 已启用声明和二进制日志中的SQL数据 但是,如果我将修改SQL数据更改为读取SQL数据,则该函数的编译效果很好。报告说: MODIFIES SQL DATA指示例程包含以下语句: 可以写入数据,例如,插入或删除 那么为什么不接受修改SQL数据呢?我知道这些特性只是建议性的,但我仍然希望使用正确的特性 CREATE FUNCTION DoSomethi
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、NO-SQL 或者,读取SQL数据并不意味着什么都不确定,它只是表明您已经决定了它的安全性。 没有SQL或读取SQL数据的函数清楚地告诉MySQL内部没有数据操作,它们是安全的 通过使用DETERMINISTIC,您可以告诉mysql运行此函数是安全的,它确实可以操作内部数据 请参阅第页,内容如下: 默认情况下,对于要接受的CREATEFUNCTION语句,至少 必须指定确定性、无SQL或读取SQL数据中的一个 明确地说
Updates employeeDETERMINISTIC表示函数为相同的输入参数生成相同的结果。绝对不是这样,因为表值可能会更改。然而,MySQL工作台在使用非确定性时无法编译。好的,我应该写更多的信息。函数只返回值,如果您向mysql表明您的函数是安全的,那么出于安全原因,可能有一些东西无法在函数中使用,例如stetements。所以,如果你想在你的功能中得到最新的员工,就如我所写的那样,把它放在确定性中。
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