我的供应商在我的网站上安装了Drupal CMS,现在我需要复制所有旧网站的数据。在我的旧数据库中,我有没有前缀的表,但在新的数据库中,所有表都有dp_[表名]
前缀。
zerkms的解决方案对我没有用。我必须指定information_schema
数据库才能查询Tables
表。
SELECT
CONCAT('RENAME TABLE ', GROUP_CONCAT('`', TABLE_SCHEMA, '`.`', TABLE_NAME, '` TO `', TABLE_SCHEMA, '`.`prefix_', TABLE_NAME, '`')) AS q
FROM
`information_schema`.`Tables` WHERE TABLE_SCHEMA='test';
编辑:
优化查询,仅调用一次RENAME TABLE。 我遇到的问题是连接的输出在341个字符处被截断。 可以通过将MySQL变量group_concat_max_len
设置为更高的值来解决此问题(如果服务器允许):
SET group_concat_max_len = 3072; -- UTF8 assumes each character will take 3 bytes, so 3072/3 = 1024 characters.
PhpMyAdmin现在可以帮助您完成这项操作。在“数据库”级别上,选择“结构”选项卡以查看所有表格。点击“全选”(在表格列表下方)。 在“选择项操作”下拉菜单中选择:“替换表格前缀”。
SELECT
GROUP_CONCAT('RENAME TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` TO `', TABLE_SCHEMA, '`.`prefix_', TABLE_NAME, '`;' SEPARATOR ' ')
FROM
`TABLES` WHERE `TABLE_SCHEMA` = "test";
在这里,"test"是期望的数据库名称。
之后,您可以执行长查询,并添加前缀,如果您执行它的话;-)
我稍微修改了一下,以考虑前缀也在表名中的情况。
SET @database = "database_name";
SET @old_prefix = "old_prefix_";
SET @new_prefix = "new_prefix_";
SELECT
CONCAT(
"RENAME TABLE ",
TABLE_NAME,
" TO ",
CONCAT(@new_prefix, TRIM(LEADING @old_prefix FROM TABLE_NAME)),
';'
) AS "SQL" FROM information_schema.TABLES WHERE TABLE_SCHEMA = @database;
如果还有人想知道如何做到这一点(因为其他选项对我来说都不起作用),您可以运行以下内容(当然,需要根据您的值更改前三个变量):
Original Answer翻译成"最初的回答"
SET @database = "database_name";
SET @old_prefix = "old_prefix_";
SET @new_prefix = "new_prefix_";
SELECT
concat(
"RENAME TABLE ",
TABLE_NAME,
" TO ",
replace(TABLE_NAME, @old_prefix, @new_prefix),
';'
) AS "SQL" FROM information_schema.TABLES WHERE TABLE_SCHEMA = @database;
然后您将被提示需要的一堆查询,以便更改数据库中的所有表。您只需复制它,运行它,就完成了!
原始答案:最初的回答。
SET @database = "Database-Name-Here";
SET @old_prefix = "wp_";
SET @new_prefix = "ab_";
SELECT
CONCAT(
"RENAME TABLE ",
@database,
".",
TABLE_NAME,
" TO ",
@database,
".",
CONCAT(@new_prefix, TRIM(LEADING @old_prefix FROM TABLE_NAME)),
';'
) AS "SQL" FROM information_schema.TABLES WHERE TABLE_SCHEMA = @database;
update NEWPREFIX_usermeta set meta_key = 'NEWPREFIX_capabilities' where meta_key = 'OLDPREFIX_capabilities';
update NEWPREFIX_usermeta set meta_key = 'NEWPREFIX_user_level' where meta_key = 'OLDPREFIX_user_level';
update NEWPREFIX_usermeta set meta_key = 'NEWPREFIX_autosave_draft_ids' where meta_key = 'OLDPREFIX_autosave_draft_ids';
update NEWPREFIX_options set option_name = 'NEWPREFIX_user_roles' where option_name = 'OLDPREFIX_user_roles'
information_schema
.Tables
并在我的情况下设置SET group_concat_max_len = 10240;,因为有许多表格。+1 - Mohammed JoraidSELECT CONCAT('RENAME TABLE ',TABLE_NAME,' TO backup_db.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'testbot';
- sactiwgroup_concat_max_len
变量的编辑是个好点子!我之前也没有得到完整的句子,现在很好用! - AlexGH