如何获取不含数据库Schema前缀的视图定义语句
如何获取不含数据库Schema前缀的视图定义语句
看起来你已经找到了从INFORMATION_SCHEMA提取视图DDL的基本思路,但遇到了结果里带着全限定名(库名.表名.列名)的问题,想要精简成只保留表名和列名对吧?别担心,我们可以通过字符串处理来去掉这些多余的前缀,分两种情况给你解决方案:
针对MySQL 8.0及以上版本(支持正则替换)
如果你的MySQL版本是8.0或更高,用正则替换会更灵活,能处理带反引号或不带反引号的各种命名情况:
SELECT CONCAT( 'CREATE VIEW `', TABLE_NAME, '` AS ', -- 第一步:替换 `库名`.`表名`.`列名` 或 库名.表名.列名为 `表名`.`列名` 或 表名.列名 REGEXP_REPLACE( -- 第二步:替换 `库名`.`表名` 或 库名.表名为 `表名` 或 表名 REGEXP_REPLACE(VIEW_DEFINITION, '`?db_here`?\\.`?(\\w+)`?\\.', '`$1`.'), '`?db_here`?\\.`?(\\w+)`?', '`$1`' ), ';' ) AS create_view_statement FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = 'db_here';
这里的正则表达式会匹配带或不带反引号的db_here.前缀,把db_here.tb.col转换成tb.col,把db_here.tb转换成tb,完美贴合你的需求。
针对MySQL 5.x版本(仅支持普通替换)
如果你的MySQL版本比较旧,不支持正则替换,那就用嵌套的REPLACE函数处理,虽然灵活性稍差,但针对固定库名也够用:
SELECT CONCAT( 'CREATE VIEW `', TABLE_NAME, '` AS ', -- 先处理带反引号的库名前缀,再处理不带反引号的 REPLACE( REPLACE(VIEW_DEFINITION, '`db_here`.`', '`'), 'db_here.', '' ), ';' ) AS create_view_statement FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = 'db_here';
这个写法会先把db_here带反引号的前缀去掉,再处理不带反引号的场景,基本能覆盖大部分常规命名的情况。
注意:如果你的视图里引用了其他数据库的表(比如
other_db.tb.col),这些不会被误改,因为我们只针对db_here这个库名的前缀进行替换。
内容来源于stack exchange
相关产品推荐
相关产品推荐

