スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

MySQL 参照制約

awkでCreate Table文修正

この問題は根深い。新たにデータベースを作成してそこにCREATE文を実行するとOKだった。なので、いったんデータベースを削除してから実行した。確か前はこれでうまく行ったのだが、今回は駄目。MySQLを再起動したりとかしたがこれもだめ。
errno 121が何なのかネットで検索してもわからないので、ソースを当たることに。121で検索をかけると、

manual.html
InnoDB: Let InnoDB's FOREIGN KEY parser to remove the latin1 character 0xA0 from the end of an unquoted identifier. The EMS MySQL
Manager in ALTER TABLE adds that character after a table name, which
caused error 121 when we tried to add a new constraint.

my_base.h
121 /* Dupplicate key on write */

と出てくる。やはり参照制約の問題だ。
バージョン4.1.10aを入れれば直るかと思ってバージョンアップしたが駄目。
しかし腑に落ちないのは、データベースを削除したにもかかわらずどこかに参照制約の情報が残っていることだ。
dataディレクトリの以下のファイルには削除したデータベースの情報が残っている。
ib_logfile0
ib_logfile1
ibdata1
もしやこれが原因かと思い、荒業でこれらを削除した。デーモンを起動すると、再作成された。そしてCREATEスクリプトを実行すると、きちんと作成された。ところがテーブルをDropしてから再作成しようとするとエラーになる(なお、Dropもtypeをinnodbからmyisamに変えないとできない)。

制約を単体で削除したいと思うがそれはできないようだ。
参照制約を張っている列を削除しようとするが、
ERROR 1025 (HY000): Error on rename of...(errno: 150)
となる。
もはやお手上げ。
MySQLでは、同一のテーブルに対する参照制約は使ってはならない。
というのが結論。やろうとするなら、先の荒業でlogfileを削除して再作成するほかない。

なんか非常につまらないことに時間を使っている気がする。
先日、商用サイトでMySQLをよく使っているフリーSEコミュニティの主と話をしたとき、innodbではなくmyisamを使うとのこと。トランザクションは必要としないと。
データベースというかアプリケーションにとってトランザクションは基本中の基本と考えていた私にとって、これはまったく別の世界だ。
まあ、作りがしっかりしていれば、トランザクションが必要とされる機会はめったに発生しないが。今までにも、一連のトランザクションで例外が発生したときに、きちんとロールバックさせていないソースコードを何度か見たことがあるが、そのアプリケーションは稼動して2年間無事に動いている。おそらく不整合が合っても気づいていないのだろうと推測する。


関連記事
スポンサーサイト

コメント

非公開コメント

プロフィール

dayan

Author:dayan
小職は、SE(システムエンジニア)を専門としておりますが、技術的な情報を中心に、それ以外に経済関連の日記、たわいもない日記も載せていきます。
[公式HPもよろしく!]

天気予報

-天気予報コム- -FC2-
リンク
ブロとも申請フォーム

この人とブロともになる

カテゴリー
最近の記事
ブログ内検索
最近のコメント
最近のトラックバック
RSSフィード
月別アーカイブ


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。