55775


**同じデータベース内の異なるテーブルに同じカラム名が複数あります**  
・aテーブル post_dateカラム  
・bテーブル post_dateカラム  
・cテーブル post_dateカラム

**やりたいこと**  
対象DB内にある全てのpost_dateカラム名をcreate_dateカラムへ一括変更したい

**テーブル数だけ何回も処理することが手間なので、何か良い方法はないですか** ？  
・テーブル指定する際、データベース内の全テーブルという指定はできない？  
・下記でテーブル名を動的に取得することはできない？

[code]

       UPDATE `table名` SET `column名` = replace(`column名`, 'post_date', 'create_date');
    
[/code]

* * *

＜ 追記 ＞

**Q1.指定データベースのみを対象とすることはできますか？**  
下記でデータベース名を指定後、SQL文を実行してみたのですが、「サーバ:
localhost」全体に対して行われました。指定データベースのみを対象とすることはできますか？

[code]

     use データベース名;
    
[/code]

「from `INFORMATION_SCHEMA`.`COLUMNS` 」の対象を指定データベースのみにしたい、という意味です。

**Q2.データベース名も取得することはできますか？**  
やりたいことはQ1ですが、もし「サーバ:
localhost」全体に対してしか実行できないとすると、例えば異なるデータベースで、同じテーブル名が存在していた場合(かつwhere条件も満たしていた場合)、下記のような結果になります。  
件数が多いとテーブル名からデータベース名を調べるのも大変なので、下記結果にデータベース名を追記することはできますか？

[code]

    alter table hoge change column post_date create_date date;
    alter table hoge change column post_date create_date date;
    
[/code]


CC BY-SA 4.0
2019-06-14T02:58:19.357
55773
2019-06-16T08:19:20.100
2019-06-15T01:37:58.167
7886
7886
question
mysql
データベース内の異なるテーブルに同じカラム名が複数ある時、そのカラム名を一括変更したい


この質問もつまづく初心者が多いので対応方法をご回答します。

まずは端的な回答として、[下記のSQL](http://sqlfiddle.com/#!9/ab343c/1)でテーブル名を書き換える手間を省いた上でテーブル数だけ何回も処理するのが一番楽です。

[code]

    select CONCAT('alter table ', `TABLE_SCHEMA`, '.', `TABLE_NAME`, ' change column ', `COLUMN_NAME`, ' create_date date;') ddl
    from   `INFORMATION_SCHEMA`.`COLUMNS` 
    where  `COLUMN_NAME` = 'post_date'
    # Todo データベース名を書き換え
    and    `TABLE_SCHEMA` = 'データベース名'
    
    # 下記のようなDDL文を一括生成後、複数行まとめてSQLを実行する
    # alter table schema.a change column post_date create_date date;
    # alter table schema.b change column post_date create_date date;
    # alter table schema.c change column post_date create_date date;
    
[/code]

追記のご質問にあわせてSQLを改修しました。

**A1.** where句でTABLE_SCHEMAを指定データベースのみに限定できます。

**A2.** `{データベース名}.{テーブル名}`の構文で更新するデータベースを指定できます。  
`alter table TABLE_SCHEMA.TABLE_NAME ...`

DMLでUPDATEできるのは **レコード** だけです。  
テーブル自体の構造を変えてカラム名を変更する場合はDDLで[ALTER
TABLE](https://dev.mysql.com/doc/refman/5.6/ja/alter-table.html)なさってください。

質問にある「データベース内の全テーブルという指定」はできません。  
しかしストアドファンクションを作成して「データベース内のテーブルを個別に指定」して「動的SQLで何回も処理する」ことはできます。  
※DBに慣れていないと「動的に取得」というキーワードはなかなか出にくいですが、もしも知り合いからヒントがあって動的というキーワードを得たならばそちらに頼ると的確なアドバイスが得られるように思います。

**[FYI]** (上から目線の発言で恐縮ですが...)

テーブルカラムの書き換えできる権限をお持ちの方は、 **DDL・DMLの違いを勉強された方が良い** というコメントに同意します。  
「DROP TABLEしてCREATE
TABLEする方法がググって出てきたからやりました！」のような悲劇が起こりませんように、DB管理者が知識を持つのは大事であると老婆心より申し上げます。

なお私がカラム名を一括置換することになった場合は、影響範囲とミスした時の被害が甚大なので作業前に **必ずテーブルとレコードのバックアップ** を取ります。  
カラム名の置換によるソースコードやストアドファンクションの修正範囲、修正直後にチームに与える影響も把握してからチームに影響の少ない **日程を告知**
して作業を開始します。

新人に複数テーブルのDDL文を流してもらう or 自分が新人で初めて流す時は、このくらい脅しても足りないので後ろで **作業を見守る/見守ってもらう**
ことをお勧めします。


CC BY-SA 4.0
2019-06-14T06:08:03.553
55775
2019-06-16T08:19:20.100
2019-06-16T08:19:20.100
9820
9820
55773
answer