如何使用查询为mysql中的所有表添加前缀。
例如:
我需要在mysql数据库中提供的所有表中添加“ dr _ ”。
答案 0 :(得分:14)
运行运行此查询时获得的所有查询:
SELECT Concat('ALTER TABLE `', TABLE_NAME, '` RENAME TO `dr_', TABLE_NAME, '`;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '<name of your db>';
答案 1 :(得分:13)
对于这个例子,我将创建一个名为prefixdb的数据库,其中包含4个表:
mysql> drop database if exists prefixdb;
Query OK, 4 rows affected (0.01 sec)
mysql> create database prefixdb;
Query OK, 1 row affected (0.00 sec)
mysql> use prefixdb
Database changed
mysql> create table tab1 (num int) ENGINE=MyISAM;
Query OK, 0 rows affected (0.05 sec)
mysql> create table tab2 like tab1;
Query OK, 0 rows affected (0.05 sec)
mysql> create table tab3 like tab1;
Query OK, 0 rows affected (0.05 sec)
mysql> create table tab4 like tab1;
Query OK, 0 rows affected (0.04 sec)
mysql> show tables;
+--------------------+
| Tables_in_prefixdb |
+--------------------+
| tab1 |
| tab2 |
| tab3 |
| tab4 |
+--------------------+
4 rows in set (0.00 sec)
生成它的查询将是
select
concat('alter table ',db,'.',tb,' rename ',db,'.',prfx,tb,';')
from
(select table_schema db,table_name tb
from information_schema.tables where
table_schema='prefixdb') A,
(SELECT 'dr_' prfx) B
;
在命令行运行它我得到了这个:
mysql> select concat('alter table ',db,'.',tb,' rename ',db,'.',prfx,tb,';') from (select table_schema db,table_name tb from information_schema.tables where table_schema='prefixdb') A,(SELECT 'dr_' prfx) B;
+----------------------------------------------------------------+
| concat('alter table ',db,'.',tb,' rename ',db,'.',prfx,tb,';') |
+----------------------------------------------------------------+
| alter table prefixdb.tab1 rename prefixdb.dr_tab1; |
| alter table prefixdb.tab2 rename prefixdb.dr_tab2; |
| alter table prefixdb.tab3 rename prefixdb.dr_tab3; |
| alter table prefixdb.tab4 rename prefixdb.dr_tab4; |
+----------------------------------------------------------------+
4 rows in set (0.00 sec)
将结果传回mysql,如下所示:
mysql -hhostip -uuser -pass -AN -e"select concat('alter table ',db,'.',tb,' rename ',db,'.',prfx,tb,';') from (select table_schema db,table_name tb from information_schema.tables where table_schema='prefixdb') A,(SELECT 'dr_' prfx) B" | mysql -hhostip -uuser -ppass -AN
关于您的问题,如果要重命名所有表,请不要触摸information_schema和mysql数据库。请改用此查询:
select
concat('alter table ',db,'.',tb,' rename ',db,'.',prfx,tb,';')
from
(select table_schema db,table_name tb
from information_schema.tables where
table_schema not in ('information_schema','mysql')) A,
(SELECT 'dr_' prfx) B
;
试一试!!!
答案 2 :(得分:0)
增加Rolando的优秀和全面的答案。如果你运行由他的SELECT CONCAT查询生成的RENAME查询(我使用phpMyAdmin并只是将输出查询复制到SQL框中并点击Go),那么你不应该对外键约束有任何问题。我刚刚在XAMPP的测试数据库上完成了这个,并且所有表都重命名为ok,并且约束保持不变。对于SQL专家来说,这似乎是显而易见的,但对我们业余爱好者来说可能并不那么重
答案 3 :(得分:0)
为所有数据库表添加前缀。
假设您的数据库名为“my_database”,并且您要添加的前缀是“my_prefix”,请执行以下查询:
SELECT Concat('ALTER TABLE ', TABLE_NAME, ' RENAME TO my_prefix_', TABLE_NAME, ';') FROM information_schema.tables WHERE table_schema = 'my_database'
你的结果集将是一堆查询,你可以复制并粘贴到你最喜欢的MySQL编辑器(Sequel Pro,phpMyAdmin,等等)。只需将它们粘贴并执行即可完成。