将MySQL查询转换为PostgreSQL:寻找information_schema.STATISTICS替代方案
PostgreSQL替代MySQL information_schema.STATISTICS实现等效查询
MySQL的information_schema.STATISTICS是其特有的索引信息表,PostgreSQL中没有直接对应的对象,需要通过标准信息_schema表或PostgreSQL系统表来实现相同逻辑。以下是针对你的需求改写的两种PostgreSQL查询方案:
方案一:匹配主键约束(对应MySQL PRIMARY主键逻辑)
如果核心需求是表的主键列为PK(而非严格要求索引名为PRIMARY),推荐使用标准的information_schema.key_column_usage表,兼容性更好:
SELECT t.table_name AS TName FROM information_schema.tables t JOIN information_schema.key_column_usage s ON s.table_catalog = t.table_catalog AND s.table_schema = t.table_schema AND s.table_name = t.table_name AND s.constraint_type = 'PRIMARY KEY' AND s.column_name = 'PK' AND s.ordinal_position = 1 JOIN information_schema.columns c ON c.table_catalog = t.table_catalog AND c.table_schema = t.table_schema AND c.table_name = t.table_name AND c.column_name = 'VERSION' WHERE t.table_name LIKE '%\_%' AND t.table_schema LIKE '%\_%' AND t.table_name != LOWER(t.table_name);
方案二:严格匹配索引名为PRIMARY
如果需要严格对应原MySQL查询中**索引名为PRIMARY**的条件(比如迁移后保留了原索引名称),可以用PostgreSQL的系统表组合查询:
SELECT t.table_name AS TName FROM information_schema.tables t JOIN pg_indexes s ON s.schemaname = t.table_schema AND s.tablename = t.table_name AND s.indexname = 'PRIMARY' JOIN pg_index i ON i.indexrelid = (s.schemaname || '.' || s.indexname)::regclass JOIN pg_attribute a ON a.attrelid = (t.table_schema || '.' || t.table_name)::regclass AND a.attname = 'PK' AND a.attnum = i.indkey[1] -- 匹配索引第一列,PostgreSQL数组下标从1开始 JOIN information_schema.columns c ON c.table_catalog = t.table_catalog AND c.table_schema = t.table_schema AND c.table_name = t.table_name AND c.column_name = 'VERSION' WHERE t.table_name LIKE '%\_%' AND t.table_schema LIKE '%\_%' AND t.table_name != LOWER(t.table_name);
关键差异说明
- 转义规则:PostgreSQL中
LIKE语句的下划线_只需单个反斜杠\_转义,无需MySQL的双反斜杠。 - 大小写判断:PostgreSQL中大小写混合的表名是通过双引号创建的,
information_schema.tables会保留原大小写,直接用table_name != LOWER(table_name)即可替代MySQL的BINARY比较逻辑。 - 索引信息获取:
information_schema.key_column_usage:ANSI标准表,用于获取主键、外键等约束的列信息,跨库兼容性强。pg_indexes/pg_index/pg_attribute:PostgreSQL特有系统表,能获取更底层的索引细节,适合严格匹配索引名称的场景。
内容的提问来源于stack exchange,提问作者vasu
相关产品推荐
相关产品推荐

