質問: replace(`column名`, 'post_date', 'create_date'); ``` --- < 追記 > **Q1.指定データベースのみを対象とすることはできますか?** 下記でデータベース名を指定後、SQL文を実行してみたのですが、「サーバ: localhost」全体に対して行われました。指定データベースのみを対象とすることはできますか? ``` use データベース名; ``` 「from `INFORMATION_SCHEMA`.`COLUMNS` 」の対象を指定データベースのみにしたい、という意味です。 **Q2.データベース名も取得することはできますか?** やりたいことはQ1ですが、もし「サーバ: localhost」全体に対してしか実行できないとすると、例えば異なるデータベースで、同じテーブル名が存在していた場合(かつwhere条件も満たしていた場合)、下記のような結果になります。 件数が多いとテーブル名からデータベース名を調べるのも大変なので、下記結果にデータベース名を追記することはできますか? ``` alter table hoge change column post_date create_date date; alter table hoge change column post_date create_date date; ```
回答: この質問もつまづく初心者が多いので対応方法をご回答します。 まずは端的な回答として、下記のSQLでテーブル名を書き換える手間を省いた上でテーブル数だけ何回も処理するのが一番楽です。 ``` 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; ``` 追記のご質問にあわせてSQLを改修しました。 **A1.** where句でTABLE_SCHEMAを指定データベースのみに限定できます。 **A2.** `{データベース名}.{テーブル名}`の構文で更新するデータベースを指定できます。 `alter table TABLE_SCHEMA.TABLE_NAME ...` DMLでUPDATEできるのは**レコード**だけです。 テーブル自体の構造を変えてカラム名を変更する場合はDDLでALTER TABLEなさってください。 質問にある「データベース内の全テーブルという指定」はできません。 しかしストアドファンクションを作成して「データベース内のテーブルを個別に指定」して「動的SQLで何回も処理する」ことはできます。 ※DBに慣れていないと「動的に取得」というキーワードはなかなか出にくいですが、もしも知り合いからヒントがあって動的というキーワードを得たならばそちらに頼ると的確なアドバイスが得られるように思います。 **[FYI]**(上から目線の発言で恐縮ですが...) テーブルカラムの書き換えできる権限をお持ちの方は、**DDL・DMLの違いを勉強された方が良い**というコメントに同意します。 「DROP TABLEしてCREATE TABLEする方法がググって出てきたからやりました!」のような悲劇が起こりませんように、DB管理者が知識を持つのは大事であると老婆心より申し上げます。 なお私がカラム名を一括置換することになった場合は、影響範囲とミスした時の被害が甚大なので作業前に**必ずテーブルとレコードのバックアップ**を取ります。 カラム名の置換によるソースコードやストアドファンクションの修正範囲、修正直後にチームに与える影響も把握してからチームに影響の少ない**日程を告知**して作業を開始します。 新人に複数テーブルのDDL文を流してもらう or 自分が新人で初めて流す時は、このくらい脅しても足りないので後ろで**作業を見守る/見守ってもらう**ことをお勧めします。