我不清楚IMMUTABLE,VOLATILE和STABLE函数的定义的真正含义。
我阅读了文档,特别是每个文档的定义。
IMMUTABLE指示该函数无法修改数据库,并且 在给定相同的参数值时始终返回相同的结果;也就是说,它不执行数据库查找或以其他方式使用其参数列表中不直接存在的信息。如果指定了此选项,则可以使用函数值立即替换具有全常数参数的任何函数调用。
STABLE表示该函数无法修改数据库,并且在单个表扫描中它将针对相同的参数值一致地返回相同的结果,但其结果可能会在SQL语句之间发生变化。对于其结果取决于数据库查找,参数变量(例如当前时区)等的函数,这是适当的选择。(对于希望查询当前命令修改的行的AFTER触发器来说,这是不合适的。)还请注意, current_timestamp系列功能符合稳定条件,因为它们的值在事务中不会更改。
VOLATILE表示该功能值即使在一次表扫描中也可以更改,因此无法进行优化。从这个意义上说,相对来说很少有数据库函数是易变的。一些示例是random(),currval(),timeofday()。但是请注意,任何具有副作用的函数都必须归类为易失性,即使其结果是可以预测的,也可以防止调用被优化。一个示例是setval()。
我的困惑来自与不可改变的条件,稳定的功能总是或始终返回相同的结果给出了相同的论点。
IMMUTABLE定义指出该函数不进行数据库查找或以其他方式使用未直接存在于其参数列表中的信息。因此,对我而言,这意味着此类函数用于操作客户端提供的数据,并且不应具有SELECT语句……尽管这听起来有点奇怪。
使用STABLE时,定义是相似的,因为它表示应始终返回相同的结果。因此,对我来说,这意味着每次使用相同的参数调用该函数时,它应返回相同的结果(相同的行,每次相同)。
因此,对我来说...意味着对表或可更新表执行SELECT的任何函数都应仅是易失性的。
但是,再次...对我来说听起来不对。
回到我的用例,我正在编写函数,这些函数在不断添加的表上执行带有多个JOIN的SELECT语句,因此,即使每次调用时,即使使用相同的参数,也希望函数调用返回不同的结果。 。
那么,这是否意味着我的功能应该是挥发性的?即使文档表明在这种意义上相对较少的数据库功能也是易失的?
谢谢!