MySQL不支持递归函数?为什么?从什么时候开始?
我编写了一个存储的函数,它递归地调用自身。
然而,当我在查询中运行它时,我得到了这个无耻的错误:
错误:1424 SQLSTATE:HY000 (ER_SP_NO_RECURSION)
消息:不允许使用递归存储函数和触发器。
“不允许”?
正确的。为什么我们不直接禁用 WHILE 循环呢?
我可以以任何方式启用递归函数吗?
我发现了错误报告,但是有解决方法吗?
我在 Windows XP(XAMPP 服务器)上运行 MySQL 5.1.41。
I've written a stored FUNCTION that calls itself, recursively.
However when I run it in a query I get this shameless error:
Error: 1424 SQLSTATE: HY000 (ER_SP_NO_RECURSION)
Message: Recursive stored functions and triggers are not allowed.
"Not allowed"?
Right. Why don't we just disable WHILE loops also, while we're at it?
Can I enable recursive functions in any way?
I found a bug report, but are there any workarounds?
I'm running MySQL 5.1.41 on Windows XP (XAMPP Server).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
MySQL 5.1 支持递归存储过程,但不支持递归函数。引用 文档:
MySQL 5.1 supports recursive stored procedures, but not recursive functions. Quoting the docs:
没问题,詹科。
不如 PostgreSQL 函数那么高效,但在 MySQL 程序中也是可能的:
Sergei Zaytsev。
No problem, Jenco.
Not so efficient as PostgreSQL functions, but it's possible in MySQL procedures also:
Sergei Zaytsev.
可能不鼓励存储例程中的递归,因为 MySQL 需要限制其线程的堆栈大小。
MySQL 通常每个连接使用一个线程。数百或数千个连接很常见。
在 32 位平台上,运行 1,000 个线程时会产生很大的地址空间压力,因此需要将堆栈设置得非常小以避免地址空间耗尽。
当然,堆栈溢出是非常糟糕的——它无法安全地恢复。所以我认为MySQL这样做是为了防止堆栈溢出,尤其是在32位平台上。
也就是说,现在任何在生产 MySQL 服务器上使用 32 位操作系统的人都是疯了。
Probably recursion in stored routines is discouraged because MySQL needs to limit its threads' stack size.
MySQL typically uses one thread per connection. 100s or 1000s of connections are common.
On 32-bit platforms, there is significant address-space pressure when running 1,000 threads, so the stacks need to be set very small to avoid address-space exhaustion.
Stack overflow is, of course, very bad - it can't be recovered from safely. So I think MySQL does this to prevent stack overflows, especially on 32-bit platforms.
That said, anyone using a 32-bit OS for a production MySQL server nowadays is insane.