Eclipseからの主キー・外部キーの追加
主キー、外部キーを追加する機能
最後に紹介するのは主キー、外部キー制約を追加する機能です。今回はテーブル「dept」を作成してから主キーを追加し、次にテーブル「emp」にテーブル「dept」への外部キーを設定します。まず、テーブル「dept」を作成します。列の情報のみを定義した下記のCREATE TABLE文を用います。
CREATE TABLE hellodb.dept
(
deptno INT,
dname CHAR(50)
)
/
このSQLをSQL実行・ビューに入力し、[全てのSQLを実行]ボタンを押して実行してから、DBツリービューでTABLEを右クリックして[更新(F)]を実行します。
![図41:(1)SQL実行・ビューに入力し、(2)[全てのSQLを実行]ボタンを押して実行、(3)DBツリービューでTABLEを右クリックし、(4)[更新(F)]を実行](http://cz-cdn.shoeisha.jp/static/images/article/3813/7-41s.gif)
主キーの追加
では、このテーブル「dept」に主キーを追加します。DBツリー・ビューでTABLEの下に現れたdeptをダブルクリックすると、右上にテーブルのビューが表示されるので、[定義情報]タブをクリックします。テーブル名、テーブルコメント、列ごとの情報の下に制約(CONSTRAIT)と索引(INDEX)の定義域が表示されるので、CONSTRAITを右クリックして[主キーの追加(P)]を実行します。
![図42:(1)deptをダブルクリックし、(2)[定義情報]タブをクリックし、(3)CONSTRAITを右クリックして(4)[主キーの追加(P)]を実行](http://cz-cdn.shoeisha.jp/static/images/article/3813/7-42s.gif)
「主キーの登録」ダイアログが表示されるので、カラムリストから主キーにしたい列を選んで、[>]ボタンをクリックします。今回は「deptno」を主キーとしました。
![図43:カラムリストから主キーにしたい列を選んで[>]ボタンをクリック](http://cz-cdn.shoeisha.jp/static/images/article/3813/7-43s.gif)
「deptno」がカラムリストから対象カラムに移ったら、「制約名」を入力して[次へ(N)]ボタンをクリックします。今回は制約名を「pk」としました。
![図44:制約名を入力して[次へ(N)]ボタンをクリック](http://cz-cdn.shoeisha.jp/static/images/article/3813/7-44s.gif)
ダイアログは「SQLの確認」に進み、「deptno」を主キーにするためのSQL文が表示されます。[終了(F)]ボタンをクリックします。
![図45:SQLを確認して[終了(F)]ボタンをクリック](http://cz-cdn.shoeisha.jp/static/images/article/3813/7-45s.gif)
ALTER TABLE文の実行が完了すると、[定義情報]タブの内容が書き換わります。主キー(PRIMARY KEY)の制約が追加されると共に、deptno列の[必須]のチェックがオンになり、初期値が設定されます。また画面では隠れていますが、主キーに無条件に用意される索引も作成されています。
![図46:[定義情報]タブの内容が書き換わる](http://cz-cdn.shoeisha.jp/static/images/article/3813/7-46s.gif)
MySQLで外部キー制約のチェックをサポートするのはInnoDBテーブルに限られます。今回はバージョン5.1を多機能データベースとしてインストールしていますので、InnoDBストレージエンジンが有効であり問題ありませんが、バージョン5.0以前では設定や動作が異なる場合があります。例えば、バージョン5.0ではストレージエンジンを明示的にMyISAMからInnoDBに変更しないと外部キーの制約の設定ができません。
次に外部キーを設定します。まず、テーブル「dept」にレコードを登録します。今回はテーブル「emp」のdeptnoの外部キーなので、[レコードの追加]ボタンを用いてテーブル「emp」に入力済みのdeptnoを全てテーブル「dept」に入力しておきます。
![図47:[レコードの追加]ボタンを用いてテーブル「dept」にデータを入力](http://cz-cdn.shoeisha.jp/static/images/article/3813/7-47s.gif)
では、このテーブル「emp」にテーブル「dept」への外部キーを追加します。DBツリー・ビューでTABLEの下のempをダブルクリックすると、右上にテーブルのビューが表示されるので、[定義情報]タブをクリックします。CONSTRAITを右クリックして[外部キーの追加(F)]を実行します。
![図48:(1)empをダブルクリックし、(2)[定義情報]タブをクリックし、(3)CONSTRAITを右クリックして(4)[外部キーの追加(F)]を実行](http://cz-cdn.shoeisha.jp/static/images/article/3813/7-48s.gif)
[外部キーの追加]ダイアログが表示されるので、[主キーの登録]と同じ手順でカラムリストからdeptno列を選んで[>]ボタンをクリックし、「deptno」がカラムリストから対象カラムに移ったら、制約名を入力して[次へ(N)]ボタンをクリックします。今回は制約名を「fk」としました。
![図49:外部キーにしたい列を選んで[>]ボタンをクリックし、制約名を入力して[次へ(N)]ボタンをクリック](http://cz-cdn.shoeisha.jp/static/images/article/3813/7-49s.gif)
すると、ダイアログは「ForeginKey制約の登録」に進み、参照先のテーブルおよびカラムの選択を求められます。参照元テーブルでdeptを選択すると、カラムリストにテーブル「dept」の列名が表示されるので、deptno列を選んで[>]ボタンをクリックします。deptnoがカラムリストから対象カラムに移ったら、[次へ(N)]ボタンをクリックします。なお、この時、DELETE CASCADEオプションを無効にすることもできます(このオプションがONである場合、参照先テーブルからレコードを削除すると、そのレコードの値を参照している元テーブルのレコードも同時に削除されので注意しましょう)。
![図50:(1)参照先のテーブルを選択し、(2)外部キーに参照される列を選んで、(3)[>]ボタンをクリックし、(4)[次へ(N)]ボタンをクリック](http://cz-cdn.shoeisha.jp/static/images/article/3813/7-50s.gif)
ダイアログは「SQLの確認」に進み、外部キーを設定するためのSQL文が表示されます。[終了(F)]ボタンをクリックします。
![図51:SQLを確認して[終了(F)]ボタンをクリック](http://cz-cdn.shoeisha.jp/static/images/article/3813/7-51s.gif)
ALTER TABLE文の実行が完了すると、[定義情報]タブの内容が書き換わります。外部キー(FOREGIN KEY)の制約が追加されると共に、外部キーに無条件に用意される非一意索引も作成されています。
![図52:[定義情報]タブの内容が書き換わる](http://cz-cdn.shoeisha.jp/static/images/article/3813/7-52s.gif)
これで主キーと外部キーが設定できたので、テーブル「emp」のDDLを確認してみましょう。[DDL]タブをクリックすると、元々あった主キー制約の下に外部キー制約が追加されていることがわかります。
![図53:[DDL]タブの内容にも反映している](http://cz-cdn.shoeisha.jp/static/images/article/3813/7-53s.gif)
では、外部キーの働きを確認してみましょう。emp表のどれかのレコードのdeptnoをテーブル「dept」に存在しない値にしてみます。今回は5件目を400にしてEnterキーを押しました。

すると、DBViewerのエラーダイヤログが表示されます。理由(英文)のとおり、外部キー制約(a foreign key constraint)により、参照する列の値をこのように変更することは認めないという制約が活きていることがわかります。

まとめ
今回の説明でデータベース操作プラグインを用いて、DBMSと連係してデータベースを操作する機能の初歩を理解できたと思います。
データベース操作プラグインとしては、Data Tools Platform(DTP)なども知られており「Eclipse IDE for Java EE Developers」パッケージにはDTPが同梱されています。対応しているDBMSの種類やバージョン、プラグインに求める役割などによって使い分けると良いでしょう。また、各プラグインにはたくさんの機能がありますが、必要な機能から順に理解を進めていけば、EclipseをDBMSのフロントエンドとして使いこなすことができると思います。
次回は、プログラミングの効率化と保守性の向上のためにEclipse 3.4が提供しているリファクタリング機能を説明します。
