MySQLで You can’t specify target のエラーがでた

You can’t specify target table ‘table_sample’ for update in FROM clause といったエラーがでました。1093 You can not specify target table comments for update in FROM clause に回答があり、無事解決できました。PostgreSQLで動作していたSQL文だったので、SQLに問題があるとなかなか気がつかずに、ちょっと時間をとられてしまいました。やれやれ。

MTOSテンプレートの置換

MTOSのテンプレートについて置換が必要になったので、SQLについて確認。文字列を連結したり、置換したりできるので、便利便利。

update mt_template set
template_name=CONCAT(‘prefix_’, template_name) where
template_blog_id=1 and template_id in (1, 2, 3);

update mt_template set
template_name=REPLACE(template_name, ‘prefix_’, ”),
template_type=’widget’
where template_blog_id=1 and template_id in (1, 2, 3);

TSVからSQL文を生成するスクリプト

UPDATEのSQL文などを、TSVから生成するスクリプトとかあると、重宝します。ということで、作りました。最近、シェルスクリプトに頼ることが多くなってきました。それだけ時間が足りないということなのか、単にEclipseを起動するのが面倒になったのか、作ったプログラムの管理をするのが嫌になったのか、いろいろと思いあたる節はありますが、まぁ、どうでもいいことです。Macですぐに試せるから、というのは環境的には大きな変化かもしれません。

!/bin/sh
fileName=$1
id0=$2

function createUpdateSql
{
  id=$1
  v=0
  if [ $# = 2 ]; then
    v=$2
  fi
  echo "UPDATE user SET c1 = $v WHERE id = $id and id0 = $id0;" >> a.sql
}

sed "s/,/    /g" $fileName > $fileName.tsv
echo "" > a.sql
while read _line ; do
  createUpdateSql $_line
done < $fileName.tsv

使い方は、下記のような感じ。fileNameにはCSVファイル名をいれる。id0はSQL文で必要なのでいれてある。複雑なCSVには対応していないし、汎用性はないけど、こういうのをテンプレートとしてもっているとそれなりに使える。

$ ./a.sh fileName id0

ちなみに、echoコマンドがMacとLinuxでは動作が違うような気がします。「-n」オプションがLinuxでないと効かない。

それから、直接mysqlやpsqlコマンドをうつという方法もあるが、個人的にはいったんSQL文のファイルに落として問題がなさそうだということを確認してから、DBへ適用するのがいいと考えています。コンパイラなどでも中間表現を使うのだが、途中経過がわかるようにしておいた方が、何かうまく動作しなかったときに、追跡しやすいからです。