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”,那么这个函数的例子是什么?
答案 0 :(得分:5)
这意味着函数或过程中不包含SQL。
来自online docs:
NO SQL
表示该例程不包含SQL语句。它可能 作为优化辅助方法,允许将该函数标记为不需要SQL所必需的处理。该组中的其他选项均表示不同级别的数据处理:
CONTAINS SQL
表示例程不包含读取或写入数据的语句。如果没有明确给出这些特征,则这是默认值。此类语句的示例为SET @x = 1
或DO RELEASE_LOCK('abc')
,它们既可以执行也不会写入数据。
NO SQL
表示该例程不包含任何SQL语句。
READS SQL DATA
表示例程包含读取数据的语句(例如,SELECT
),但不包含写入数据的语句。
MODIFIES SQL DATA
表示该例程包含可以写入数据的语句(例如,INSERT
或DELETE
)。
这些实际上是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。