【问题标题】:How to add prefix of all tables in mysql如何在mysql中添加所有表的前缀
【发布时间】:2011-12-19 17:24:38
【问题描述】:

如何使用查询为 mysql 中的所有表添加前缀。

例如:

我需要在mysql数据库中所有可用的表中添加“dr_”。

【问题讨论】:

  • 使用 INFORMATION_SCHEMA 获取数据库中的所有表。

标签: mysql rename


【解决方案1】:

运行您通过运行此查询获得的所有查询:

SELECT Concat('ALTER TABLE `', TABLE_NAME, '` RENAME TO `dr_', TABLE_NAME, '`;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '<name of your db>';

【讨论】:

  • 这看起来可以工作(虽然还没有实际运行命令),但是添加“Where TABLE_SCHEMA='db_name'”会将表限制为单个数据库,这可能是如果您有多个数据库,则需要。
  • 这真是天才!小补充,在表名周围加上`符号:SELECT Concat('ALTER TABLE `', TABLE_NAME, `' RENAME TO `dr_', TABLE_NAME, '`;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='db_name';
  • 对我不起作用,phpmyadmin 说“SQL 查询运行成功”但名称没有更改
【解决方案2】:

对于这个例子,我将创建一个名为 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
;

试试看!!!

【讨论】:

  • 不确定是什么阻止了这个答案被接受!
【解决方案3】:

补充罗兰多出色而全面的答案。如果您运行由他的 SELECT CONCAT 查询生成的 RENAME 查询(我使用 phpMyAdmin 并将输出查询复制到 SQL 框中并点击 Go),那么您应该不会遇到外键约束的任何问题。我刚刚在 XAMPP 中的一个测试数据库上完成了此操作,并且所有表都重命名为 ok,并且约束保持不变。这对 SQL 专家来说似乎很明显,但对我们这些业余爱好者来说可能不是那么明显。

【讨论】:

    【解决方案4】:

    为所有数据库表添加前缀。

    假设您的数据库名为“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 等)中。只需将它们粘贴进去并执行,就大功告成了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 2011-01-28
      • 2018-08-09
      • 1970-01-01
      • 2013-02-04
      • 2015-12-05
      相关资源
      最近更新 更多