Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL存储函数不会使用修改的SQL数据进行编译_Mysql_Mysql Workbench - Fatal编程技术网

MySQL存储函数不会使用修改的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

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

错误1418:此函数没有确定性、SQL或读取 已启用声明和二进制日志中的SQL数据

但是,如果我将修改SQL数据更改为读取SQL数据,则该函数的编译效果很好。报告说:

MODIFIES SQL DATA指示例程包含以下语句: 可以写入数据,例如,插入或删除

那么为什么不接受修改SQL数据呢?我知道这些特性只是建议性的,但我仍然希望使用正确的特性

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 employee

DETERMINISTIC表示函数为相同的输入参数生成相同的结果。绝对不是这样,因为表值可能会更改。然而,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