2011-11-01 5 views
8

クエリを使用してmysqlのすべてのテーブルにプレフィックスを追加する方法を教えてください。例えばmysqlのすべてのテーブルの接頭辞を追加するには

私は、MySQLデータベースで使用可能なすべてのテーブルに「dr_」を追加する必要があります。

+1

データベース内のすべてのテーブルを取得するには、INFORMATION_SCHEMAを使用します。 –

答えて

11

実行このクエリを実行しているから取得するすべてのクエリ:この例では

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

これはうまくいくようですが(実際にはまだコマンドを実行していないようですが)、 "Where TABLE_SCHEMA = 'db_name'"を追加すると、複数のデータベースを持っている場合に必要なテーブルが1つのdbに制限されます。 –

+1

これは天才です!テーブル名の前後に\記号を追加します。SELECT concat( 'ALTER TABLE \ '、TABLE_NAME、\' '\' dr_ '、TABLE_NAME、' \'; 'の名前を変更してください)INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'db_name'; ' – Jeffrey

12

、私は4つのテーブルでprefixdbと呼ばれるデータベースを作成します。それを生成するために

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) 

クエリを希望は

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 
; 

試してみてください!

+0

何がこの回答を停止したことがこれまで受け入れられているのか分かりません! – codisfy

0

Rolandoの優れた包括的な答えに追加します。 SELECT CONCATクエリ(私はphpMyAdminを使用し、出力クエリをSQLボックスにコピーしてGoをヒットした)で生成されたRENAMEクエリを実行すると、外部キー制約に問題はありません。私はXAMPPのテストデータベースでこれを行い、すべてのテーブルの名前がokに変更され、制約はそのまま残りました。これはSQLの専門家には明らかですが、おそらくあまり私たちのアマチュアにはあまりないかもしれません。

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など)に貼り付けます。それらを貼り付けて実行すれば、すべて完了です。

関連する問題