MySQL“NO SQL”函数到底意味着什么?

时间:2011-10-14 01:14:44

标签: mysql

MySQL“NO SQL”函数qualifer的含义是什么?假设我有这个函数定义:

DELIMITER $$
CREATE FUNCTION Test() RETURNS text
NO SQL
BEGIN
  DECLARE x TEXT DEFAULT '';
  SET x = CONCAT('X = ', UUID());
  RETURN x;
END $$
DELIMITER ;

这应该被声明为NO SQL吗?如果不是如何宣布?

如果上面不应该声明为“NO SQL”,那么这个函数的例子是什么?

2 个答案:

答案 0 :(得分:5)

这意味着函数或过程中不包含SQL。

来自online docs

  • NO SQL表示该例程不包含SQL语句。

它可能 作为优化辅助方法,允许将该函数标记为不需要SQL所必需的处理。该组中的其他选项均表示不同级别的数据处理:

  • CONTAINS SQL表示例程不包含读取或写入数据的语句。如果没有明确给出这些特征,则这是默认值。此类语句的示例为SET @x = 1DO RELEASE_LOCK('abc'),它们既可以执行也不会写入数据。

  • NO SQL表示该例程不包含任何SQL语句。

  • READS SQL DATA表示例程包含读取数据的语句(例如,SELECT),但不包含写入数据的语句。

  • MODIFIES SQL DATA表示该例程包含可以写入数据的语句(例如,INSERTDELETE)。

这些实际上是SQL标准定义的子句,但有趣的是要注意该链接页面的另一个引用:

  

在MySQL中,这些特征仅供参考。服务器不会使用它们来约束例程允许执行的语句类型。

换句话说,除了使语言与标准兼容外,他们实际上并没有中做任何事情。

就使用 no SQL的函数示例而言,您可能会使用一个字符串,并在稍后返回一个哈希值以便存储到数据库中。

答案 1 :(得分:2)

示例函数的正确定义是CONTAINS SQL。除了SQL之外,SQL标准允许函数使用其他语言,例如,不包含SQl的C函数将被定义为LANGUAGE C NO SQL。

C函数也可能包含非修改SQL,标准SQL定义则为LANGUAGE C CONTAINS SQL。

在MySQL中,只支持SQL,因此仅为了支持标准而不存在SQL。