我想复制许多名称相似但前缀不同的表格。我希望带有wp_前缀的表能够使用shop_前缀进入相应的表。
换句话说,我想做这样的东西:
insert into shop_wpsc_*
select * from wp_wpsc_*
你如何做到这一点?
答案 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_%'
)
然后遍历该结果集,并以您从当前表中读取的形式创建一个动态语句,并插入相应的新表中。