复制MySQL中的许多表

时间:2010-07-26 20:41:01

标签: sql mysql regex

我想复制许多名称相似但前缀不同的表格。我希望带有wp_前缀的表能够使用shop_前缀进入相应的表。

换句话说,我想做这样的东西

insert into shop_wpsc_*
select * from wp_wpsc_*

如何做到这一点?

4 个答案:

答案 0 :(得分:3)

SQL不允许使用通配符表名 - 执行此操作的唯一方法是在使用动态SQL时循环执行表列表(通过ANSI INFORMATION_SCHEMA / INFORMATION_SCHEMAS)。

每个数据库供应商的动态SQL都不同......

更新

的MySQL?你为什么不首先这么说......

除了this is my fav link之外,MySQL的动态SQL称为“准备好的语句” - documentation。关于MySQL数据库中所有表的操作有很多关于SO的问题 - 只需要调整WHERE子句来获取你想要的表名。

您希望在MySQL stored procedure ...

中执行此操作

答案 1 :(得分:2)

您可以通过将多个语句组合到一个预准备语句中来实现此目的 - 尝试这样做:

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;

答案 2 :(得分:1)

扩展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的。)

答案 3 :(得分:0)

首先,我会从目录视图中选择所有表(这些表的名称可能取决于您的dmb,但如果它们是ansi兼容的,则应支持INFORMATION_SCHEMA),以wp_wpsc_开头。

(例如对于DB2:

SELECT NAME FROM TABLES WHERE NAME LIKE 'wp_wpsc_%'

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