You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL存储过程归属疑问及PostgreSQL实现对比咨询

MySQL存储过程的归属疑问及与PostgreSQL的对比

先回顾一下你在MySQL里的操作步骤:

创建存储过程

你在test数据库下创建了统计CUSTOMERS1表行数的存储过程,操作命令如下:

mysql> use test;
mysql> delimiter //;
mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
-> BEGIN
-> SELECT COUNT(*) INTO param1 FROM CUSTOMERS1;
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;

查询存储过程

要查看这个存储过程的信息,你需要从information_schema.routines这个系统元数据表中查询:

mysql> use information_schema;
Database changed
mysql> select * from routines where routine_name = "simpleproc";

调用存储过程

调用时必须指定它所属的test数据库:

mysql> call test.simpleproc(@a);
Query OK, 1 row affected (0.00 sec)

接下来解答你的核心疑问:

1. MySQL中存储过程的归属

首先明确一点:这个simpleproc存储过程是完全归属在你创建它时所在的test数据库下的。

information_schema.routines只是MySQL的系统元数据集合,它的作用是记录所有数据库中存储过程、函数等对象的元信息(比如所属数据库、创建时间、定义语句等),相当于一个全局的“目录清单”,而不是存储过程实际的“归属地”。你可以把它理解成:所有存储过程都存在各自的数据库里,而information_schema.routines只是把这些对象的信息汇总起来方便查询而已。

2. PostgreSQL中的情况

PostgreSQL作为对SQL标准贴合度很高的数据库,逻辑和这个是一致的:

  • 存储过程(以及函数)是归属在特定数据库的schema下的(默认是public schema),创建时如果不指定schema,就会放在当前数据库的默认schema里。
  • PostgreSQL也有对应的系统目录表,比如pg_proc,用来存储所有存储过程、函数的元数据,和MySQL的information_schema.routines作用一样,只是用来查询元信息,不是存储过程的实际归属容器。
  • 调用PostgreSQL的存储过程时,如果你不在对应的schema下,也需要指定数据库名.模式名.存储过程名(或者至少指定模式名,因为当前数据库是连接时指定的)。

3. 关于SQL标准的说明

这种“数据库对象归属到特定数据库/模式”的逻辑,是符合SQL标准的,并不是MySQL独有的特性。SQL标准定义了数据库对象的层级结构:数据库(Database)→ 模式(Schema)→ 具体对象(表、存储过程、函数等)。系统元数据表只是标准中规定的用来查询对象元信息的机制,而非对象的存储容器。

PostgreSQL作为公认的贴近标准的实现,完全遵循这个逻辑,和MySQL在核心归属规则上是一致的,只是元数据表的名称和具体细节有差异而已。


内容的提问来源于stack exchange,提问作者Tim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:10:57