カテゴリー別アーカイブ: MySQL

リンク切れしているデータを探すSQL

他のテーブルのデータのIDなどを保持して関連づけしているときに、いつの間にかリンク先テーブルのデータを削除してリンク切れを起こしてしまうことがある。

そこでリンクが切れているデータを探すSQL

aTable
 ├ id
 └ b_id(bTableのリンク先id
bTable
 └ id
という構成のときに、aTableの中からリンク先のbTableに対象となるidのデータが存在しないものを抽出する。
SELECT aTable.id
FROM aTable
LEFT JOIN bTable ON aTable.b_id = bTable.id
WHERE bTable.id IS NULL

aTableとbTableをLeft Joinで結合したときに相手方のidがNULLになってしまうものを抽出すればいい。

フールドのデータを連番に更新するSQL

あるMySQLデータベースを更新するために、ローカルにデータベースを複製してここで更新したデータを差し戻すという方法をとったことがある。差し戻すときに追加データの場合、auto-incrementに指定してあるフィールドの値はよく確認しないと、ローカルで作業中にオリジナルのデータベースでもデータの追加が行なわれてしまっていた場合にIDがバッティングしてしまう。

たいていの場合はオリジナルのデータベースでその時点でのauto-incrementの最大値を確認してそれ以上になるようにローカルのデータベースのauto-increment値に一定値を加算するんだけど、今回はちょっとちがうことをしたくなった。

オリジナルのデータベースではデータ削除によってauto-increment値がとびとびになっている。ま、それはまったく構わないんだけど、大きく連番が空いている部分がある。今回のシステムではいったん削除したauto-increment値にまったく関係ないデータが入力されてもシステムの動作に全く問題ないので、追加分のデータはこのauto-increment値が連続で大きく空きができている部分に追加することにした。

そのためにはローカルで追加したデータのauto-increment値をある値からの連番に振りなおす必要がある。

で、そのためのSQL文が次の2行

SET @i := 0;
UPDATE `テーブル名` SET `カラム名` = (@i := @i +1) WHERE [条件]

これでカラムのデータを1からの連番に振りなおすことができる。

MySQLのアンインストール@Leopard

ターミナルを起動して
/usr/local/mysql/bin/mysqladmin -u root -p shutdown
でmysqlを停止して
sudo rm -rf /usr/local/mysql-5.0.67-osx10.5-x86
でMySQLをデータごと消去して(mysql-5.0.67-osx10.5-x86の部分はバージョンによって異なる)、自動起動スクリプトもインストールしてるなら
sudo rm -rf /Library/StartupItems/MySQLCOM/
で消去

以上