SQL
SQL
Java2 SE 5.0 API
Java2 SE 1.4 API
Java2 EE API
Struts 1.0.2
MSDN2 Library
MySQL 5.1
MySQL 4.1
HTMLリファレンス
CSSリファレンス
JavaScript
基本カラーチャート
カレンダー
 最新PG・講座情報
 最新ニュース
 電子辞書・辞典
ご意見・ご要望はこちらまで

連載

SQL

MySQLの参照整合性


1.参照整合性とは

 SQLには互いの表関連の整合性を保つために参照整合性という仕組みがあります。 リレーショナル・データベースならではの機能ですが、MySQLの旧安定版の3.23 (Old production release) では参照整合性はサポートされておらず、4.0からサポートされました。
 但し、通常のテーブル型ではできず、InnoDB型で作成されたテーブル同士の関連でのみ可能となります。

 SQLコマンドから参照整合性を扱えることで次のような利点があります。

  • 両方の表に関連性を持たないレコードの追加を阻止できる
  • 一方の表のレコードを更新した場合、関連する表のレコードの自動更新する
  • 一方の表のレコードを削除した場合、関連する表のレコードの自動削除する

2.関連テーブルの作成

 データベースはMySQLのtestを使用し、関連テーブルは下の図のように社員表(参照表)部門表(被参照表)を作成することにします。
 部門表には全ての部署名が存在し、社員表には全ての社員が存在します。社員はいずれかの部署に属しており、 存在しない所属コードを持つことはありえません。 ここでは所属コードを削除した場合に関連する社員も同時に削除されることにします。

関連テーブルの説明
注)テーブル名、項目名の漢字は可能なのですが、foreign key で構文エラーとなるので、全て英文字にして
  テストします。
 
 1: C:\>cd mysql\bin
 2: C:\mysql\bin>
 3:
 4: C:\mysql\bin>mysql -u USERID -p
 5: Enter password: ********
 6: Welcome to the MySQL monitor.  Commands end with ; or \g.
 7: Your MySQL connection id is 2 to server version: 4.0.15-nt
 8:
 9: Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
10:
11: mysql> use test
12: Database changed
13: mysql> create table section (
14:     ->  code   char(4)     primary key,
15:     ->  s-name varchar(20) not null unique
16:     -> ) type=InnoDB;
17: Query OK, 0 rows affected (0.03 sec)
18:
19: mysql> create table member (
20:     ->  ID   char(4)     primary key,
21:     ->  name varchar(20) not null unique,
22:     ->  code char(4)     not null,
23:     ->  index(code), 
24:     ->  foreign key(code) references section(code) 
25:     ->          on delete cascade
26:     -> ) type=InnoDB;
27: Query OK, 0 rows affected (0.05 sec)
28:
29: mysql> show fields from section;
30: +--------+-------------+------+-----+---------+-------+
31: | Field  | Type        | Null | Key | Default | Extra |
32: +--------+-------------+------+-----+---------+-------+
33: | code   | char(4)     |      | PRI |         |       |
34: | s-name | varchar(20) |      | UNI |         |       |
35: +--------+-------------+------+-----+---------+-------+
36: 2 rows in set (0.00 sec)
37:
38: mysql> show fields from member;
39: +-------+-------------+------+-----+---------+-------+
40: | Field | Type        | Null | Key | Default | Extra |
41: +-------+-------------+------+-----+---------+-------+
42: | ID    | char(4)     |      | PRI |         |       |
43: | name  | varchar(20) |      | UNI |         |       |
44: | code  | char(4)     |      | MUL |         |       |
45: +-------+-------------+------+-----+---------+-------+
46: 3 rows in set (0.00 sec)
 コマンドプロンプト(トランザクション処理)      注) 連番は説明用で実際にはありません
 1行目   :MySQLの実行ファイルのある場所に移動する。
 4行目   :ユーザIDを指定し、MySQLを起動する。
 11行目   :データベース(test)を選択する。
 13-16行目:部門表(section)を作成する。(被参照表から定義しないとエラーになります!)
 16行目   :テーブル型(InnoDB)を設定する。
 19-26行目:社員表(member)を作成する。
 23行目   :外部キーの所属コード(code)で索引ファイルを作成する。(明記しないとエラーになります!)
 24-25行目:社員表(member)の所属コード(code)と部門表(section)の所属コード(code)を
        外部キーとして関連付ける。
        同時にテーブル間の連鎖削除を設定する。(連鎖更新の場合は on update cascade)
 26行目   :テーブル型(InnoDB)を設定する。
 29行目   :部門表(section)定義を確認する。
 38行目   :社員表(member)定義を確認する。

 
 INDEX
  連載 SQL MySQLの参照整合性
1.参照整合性とは
  2.参照整合性の確認
Top
Copyright© 2003-2007 FumikiChan All Rights Reserved.
http://www.fumikichan.net/