カスタムフィールドの型を変える(その4)

昨日の続きで、変更前後でデータの保存先の列が異なる場合の、カスタムフィールドの型の変え方を解説します。
今日は、ウェブサイト/ブログ/ユーザーのカスタムフィールドの場合を取り上げます。

1.注意事項

昨日と同様に、この記事で取り上げる方法では、データベースを直接に操作します。
操作を間違うと、Movable Typeのデータ(特にカスタムフィールドのデータ)が壊れることもあり得ます。

データベースを操作する前に、データを必ずバックアップしておいてください。
また、バックアップしたデータを正しく復元できることも確認しておいてください。
操作ミスでデータが壊れたとしても、当方は責任を負いません。

2.SQLの実行

基本的な手順は、昨日の記事と同じです。
ただし、ウェブサイト/ブログ/ユーザーのカスタムフィールドはシステムレベルでしか作成できないので、データを移動するSQLから、ブログ/ウェブサイトを指定する条件を削除します。

まず、先日の記事に書いた手順で、mt_fieldテーブルを書き換えておきます。
この際には、SQLの中でブログのIDを指定する箇所を「WHERE field_blog_id = 0」にして、システムのカスタムフィールドであるという条件を指定します。

次に、以下の2つのSQLを順に実行します。

1つ目

UPDATE mt_○○○_meta, mt_○○○
SET ○○○_meta_□□□ = ○○○_meta_△△△
WHERE ○○○_id = ○○○_meta_○○○_id
AND ○○○_meta_type = 'field.◎◎◎'

2つ目

UPDATE mt_○○○_meta, mt_○○○
SET ○○○_meta_△△△ = NULL
WHERE ○○○_id = ○○○_meta_○○○_id
AND ○○○_meta_type = 'field.◎◎◎'

SQL内の記号の意味は、昨日の記事と同じです。
また、オブジェクトの型名には、以下の値を指定します。

オブジェクトの種類型名
ブログまたはウェブサイトblog
ユーザーauthor

3.事例

例えば、以下の状況だとします。

  • ユーザーにテキスト型のカスタムフィールドがある
  • ベースネームはauthor_msg
  • テキスト型からテキスト(複数行)型に変えたい

この場合、まず以下のSQLで、mt_fieldテーブルを書き換えます。

UPDATE mt_field SET field_type = 'textarea'
WHERE field_blog_id = 0
AND field_basename = 'author_msg'

次に、データを移動します。
テキスト型/テキスト(複数行)型では、データはそれぞれvchar_idx/vclob列に保存されています。
そこで、以下の2つのSQLを実行します。

1つ目

UPDATE mt_author_meta, mt_author
SET author_meta_vclob = author_meta_vchar_idx
WHERE author_id = author_meta_author_id
AND author_meta_type = 'field.author_msg'

2つ目

UPDATE mt_author_meta, mt_author
SET author_meta_vchar_idx = NULL
WHERE author_id = author_meta_author_id
AND author_meta_type = 'field.author_msg'