30代半ばの事務職員がITエンジニアになった話

おおよそタイトルのとおり、30代半ばにしてITエンジニアのタマゴになってしまった会社員の話

【MySQL】DBをOracleからMySQLへ移行する件について ~その2~

Java製アプリケーションを
別の環境でトレースするときに
オリジナルはDBがOracleだったけど
MySQLに無理やり変更してみたときの話


Auto Commitの設定


MySQLではAuto Commitがデフォルト
一方、OracleではCommitありがデフォルト
なのでOracleを前提にしたプログラムでは
TransactionやらRollbackがどうこうという
エラーがでる可能性が高い


なのでAutoCommitをOFFにする

SET autocommit=0;


検証や研究用の環境ならむしろ
AutoCommit便利だけど、本番の環境では
やっぱりCommitありのほうが安心だと思う



カラムのデフォルト制約のこと


データをインサートするとき
デフォルト値が設定してあると

CREATE TABLE AAA ( BBB int , CCC int default 0 );


例えば↑のようにテーブルを作成した場合、

insert into AAA values(1);


とインサートすると
BBBカラムに1、CCCカラムには
デフォルト値の0が入る(はず)


こともあろうにJavaのプログラムのなかで
こんな記載がされていたわけで、、


Workbenchとかで手動でSQLを書いて
データを入れ込むのであれば
CCCカラムには何も指定されてないよ!
と警告がでるだけで処理自体はされる


で、JavaでDBを使うとなると
ドライバーを使用することになるはず


現行のはOracleJDBCドライバーを
使用していてこちらは上記のSQLに対応して
問題なく使えていた


同様にMySQLJDBCドライバーを使った場合
警告がでるだけでなくException Error
つまりエラーでプログラムが中断する…


これはMySQLのドライバーのプログラムを
書いた人がそういう仕様にしたらしく
どうしようもない様子
(英文サイトを読むと多分そんな意味あい)
確かに処理としては正しいのだろうけど、、


まぁ、無償のDBを便利に使えるドライバーを
善意で提供してくれているのだから文句など
言えるはずもなく


と、いうわけで、


根本的な解決方法は
Javaのプログラムを修正するしかない


ROWIDについて


OracleにはROWIDという隠し列があり
SELECTで呼び出すことができる
中身はというとランダムにふられた
18桁の英数字で行を特定できる
早い話がキー項目


なのでMySQLでこれを実現するには
キー項目の列を作ってやればいいことになるが
問題はSQL文がプログラムに
組み込まれている場合


ROWIDを絞り込み条件にした
SELECT文なんかがあったりしたら
独自に設定したキー項目に書き換えないといけない


ちなみにOracleのROWIDは
行を削除してバックアップから戻す場合など
変わることがあるので
あまり使わないほうがいいみたい



まだ他にもいくつかあるので
また次回に