DBDesigner 4 での UNIQUE 制約に挑戦

現在のプロジェクトでは DBDesigner 4 をデータモデリングツールとして使っているのですが,フィールドの属性として「UNIQUE」をつけられないので困っていました。UNIQUE INDEX なら貼れるのですが(そしてそれでたしかに十分なのですが)たまたまインデックスはいらないけど UNIQUE 制約をつけたい状況がありまして,いろいろ試行錯誤していたところなんとかできました。

DBDesigner4_DatabaseInfo.ini という設定ファイルをいじる必要があるのですが,ちょっと複雑なことに,DBDesigner 4 では,アプリケーションのあるフォルダからユーザのフォルダ(Windows 2000 以降であれば C:\Documents and Settings\ユーザ名\Application Data\DBDesigner4)に設定ファイルがコピーされるんですね。なので,(もしまだ起動したことがなければ)アプリフォルダの設定ファイルを書き換えるなり,ユーザフォルダの設定ファイルを書き換えるなり,両者とも書き換えるなりしてください。

この ini ファイルに [MySQL_ほにゃららTypes] というセクションがあるので,がりがり書き換えていきます。たとえば TINYINT 型で UNIQUE 制約をサポートしたい場合,もともと

Field1=TINYINT[(length)] [UNSIGNED!] [ZEROFILL] 
// A very small integer. The signed range is -128 to 127. The unsigned range is 0 to 255.

といった設定が書いてあるかと思いますが,

Field1=TINYINT[(length)] [UNSIGNED!] [ZEROFILL] [UNIQUE]
// A very small integer. The signed range is -128 to 127. The unsigned range is 0 to 255.

のように「[UNIQUE]」というタグを付け加えてやります(タグ値の最後に!をつけると,デフォルトで選択された状態になります)。新しくモデルファイルを作って新規テーブルのフィールドタイプを TINYINT にしてやると,フィールド属性として UNIQUE のチェックボックスが出現するようになります(残念ながら属性の欄が短すぎて全部でてきませんが)。

ちなみに GUI からこの属性値を追加することもできますが,追加したい値種別がいっぱいあるので ini ファイルを書き換える方法をご紹介しました。これで万事オッケーだとおもいま…えっ?既存のモデルファイルを開いても UNIQUE が選択肢にでてこない?

この場合は,めんどうですが,モデルの xml ファイルを開くと

<DATATYPE ID="1" IDGroup="0" TypeName="TINYINT" Description="〜略" >
<PARAMS>
<PARAM Name="length" />
</PARAMS>
<OPTIONS>
<OPTION Name="UNSIGNED" Default="1" />
<OPTION Name="ZEROFILL" Default="0" />
</OPTIONS>
</DATATYPE>

のように,データ型が定義されているので,

<DATATYPE ID="1" IDGroup="0" TypeName="TINYINT" Description="〜略" >
<PARAMS>
<PARAM Name="length" />
</PARAMS>
<OPTIONS>
<OPTION Name="UNSIGNED" Default="1" />
<OPTION Name="ZEROFILL" Default="0" />
<OPTION Name="UNIQUE" Default="0" />
</OPTIONS>
</DATATYPE>

のように,UNIQUE 属性の OPTION を追加してください。

追記 2006/06/08

既存のモデルファイルこそ GUI でいじるべきかも。右のサイドバーに「Data Type」という項があるので,データ型をダブルクリックすると「Options」という項目がありますからそこに UNIQUE を追加すれば OK です。

しかしこれらのアプローチがいまいち有効じゃなかったことを今日発見しました。UNIQUE 制約修飾子が NOT NULL 制約より前にきてしまうので,sqlt に怒られてしまいます。
単に SQL::Translator::Parser::MySQL がフィールドの UNIQUE 属性をサポートしていないだけでした。rt.cpan.org 見ても多くのバグが放置されぱなっしですし,変な T シャツ作って喜んでいるばあいではないと思いました。といいつつ,実は CVS 版では修正されまくっているんで新リビジョンのリリースが待ち遠しいですね。