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

カスタムフィールドの型を変更する場合、変更前後でデータの保存先の列が異なる場合もあります。
その時は、昨日の記事の作業を行った上で、データの保存先の列を変えることも必要になります。
今日は、ウェブサイト/ブログ/ユーザー以外のカスタムフィールドの場合を取り上げます。

1.注意事項

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

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

2.mt_fieldテーブルの書き換え

まず、昨日の記事に書いた手順で、mt_fieldテーブルを書き換えておきます。

3.データの移動

次に、以下のようなデータの保存先の列を変えるために、以下の2つのSQLを実行します。
1つ目のSQLで、移動元の列から移動先の列にデータをコピーします。
そして、2つ目のSQLで、移動元の列のデータを削除します。

1つ目

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

2つ目

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

上記のSQLにある記号は、それぞれ以下に置き換えます。

記号置き換える内容
○○○オブジェクトの型名(後の表を参照)
□□□データの移動先の列名(一昨日の記事を参照)
△△△データの移動元の列名(一昨日の記事を参照)
◇◇◇ウェブサイト/ブログのID
◎◎◎カスタムフィールドのベースネーム

また、オブジェクトの型名には、以下の値を指定します。

オブジェクトの種類型名
ブログ記事またはウェブページentry
カテゴリまたはフォルダcategory
アイテム系(アイテム/オーディオ/ビデオ/画像)asset
コメントcomment
テンプレートtemplate

4.事例

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

  • ブログのIDが2番
  • ブログ記事にテキスト型のカスタムフィールドがある
  • ベースネームはentry_url
  • テキスト型からURL型に変えたい

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

UPDATE mt_field SET field_type = 'url'
WHERE field_blog_id = 2
AND field_basename = 'entry_url'

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

1つ目

UPDATE mt_entry_meta, mt_entry
SET entry_meta_vchar = entry_meta_vchar_idx
WHERE entry_id = entry_meta_entry_id
AND entry_blog_id = 2
AND entry_meta_type = 'field.entry_url'

2つ目

UPDATE mt_entry_meta, mt_entry
SET entry_meta_vchar_idx = NULL
WHERE entry_id = entry_meta_entry_id
AND entry_blog_id = 2
AND entry_meta_type = 'field.entry_url'