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下的(默认是
publicschema),创建时如果不指定schema,就会放在当前数据库的默认schema里。 - PostgreSQL也有对应的系统目录表,比如
pg_proc,用来存储所有存储过程、函数的元数据,和MySQL的information_schema.routines作用一样,只是用来查询元信息,不是存储过程的实际归属容器。 - 调用PostgreSQL的存储过程时,如果你不在对应的schema下,也需要指定
数据库名.模式名.存储过程名(或者至少指定模式名,因为当前数据库是连接时指定的)。
3. 关于SQL标准的说明
这种“数据库对象归属到特定数据库/模式”的逻辑,是符合SQL标准的,并不是MySQL独有的特性。SQL标准定义了数据库对象的层级结构:数据库(Database)→ 模式(Schema)→ 具体对象(表、存储过程、函数等)。系统元数据表只是标准中规定的用来查询对象元信息的机制,而非对象的存储容器。
PostgreSQL作为公认的贴近标准的实现,完全遵循这个逻辑,和MySQL在核心归属规则上是一致的,只是元数据表的名称和具体细节有差异而已。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

