代码之家  ›  专栏  ›  技术社区  ›  nnyby

在MySQL中复制多个表

  •  1
  • nnyby  · 技术社区  · 15 年前

    我想复制许多名称相似但前缀不同的表。我希望具有wp_uu前缀的表进入具有shop_u前缀的相应表中。

    换句话说,我想这样做 某物 这样地:

    insert into shop_wpsc_*
    select * from wp_wpsc_*
    

    将如何 这样做吗?

    4 回复  |  直到 15 年前
        1
  •  1
  •   dcp    15 年前

    稍微扩展一下omg ponies的答案,您可以使用数据字典并编写一个SQL来编写SQL。例如,在Oracle中,您可以这样做:

    SELECT 'insert into shop_wpsc_' || SUBSTR(table_name,9) || ' select * from ' || table_name || ';'
    FROM all_tables
    WHERE table_name LIKE 'WP_SPSC%'
    

    这将生成一系列可以作为单个脚本运行的SQL语句。不过,正如omg ponies所指出的那样,根据您使用的数据库供应商(例如 all_tables 是Oracle特有的)。

        2
  •  3
  •   OMG Ponies    15 年前

    SQL不允许使用通配符表名-唯一的方法是在使用动态SQL时循环访问表列表(通过ansi-information_-schema/information_-schemas)。

    动态SQL对于每个数据库供应商都是不同的…

    更新

    MySQL?你一开始为什么不这么说…

    MySQL的动态SQL称为“准备好的语句”- this is my fav link 除此之外 documentation . 有很多关于MySQL数据库中所有表的操作的问题,只需要调整WHERE子句就可以得到所需的表名。

    您将希望在 MySQL stored procedure

        3
  •  2
  •   Tom    15 年前

    您可以通过将多个语句组合成一个准备好的语句来实现这一点--尝试这样做:

    SELECT @sql_text := GROUP_CONCAT(
                                  CONCAT('insert into shop_wpsc_',
                                          SUBSTRING(table_name, 9),
                                          ' select * from ', table_name, ';'), ' ')
      FROM INFORMATION_SCHEMA.TABLES
     WHERE table_schema = 'example'
       AND table_name LIKE 'wp_wpsc_%';
    
    PREPARE stmt FROM @sql_text;
    
    EXECUTE stmt;
    
        4
  •  0
  •   Janick Bernet    15 年前

    首先,我将从目录视图中选择所有表(这些表的名称可能取决于您的DMB,但是如果它们与ANSI兼容,它们应该支持以以下开头的信息模式) wp_wpsc_ .

    (例如,对于DB2:

    SELECT NAME FROM TABLES WHERE NAME LIKE 'wp_wpsc_%'
    

    )

    然后迭代该结果集,并以您给定的形式创建一个动态语句,从当前表中读取并插入到相应的新表中。