みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

MySQL5.1 で外部キーの動作を検証する方法?

お世話になります。
MySQL 5.1 で勉強中の初心者です。

外部キーの設定が出来ているらしいのですが、親テーブルを更新しても子テーブルに反映されません。

一応
http://oshiete1.goo.ne.jp/qa3828231.html
も見ましたが、MySQLのバージョン(4.0)が違うのが気になります。
持っている教科書には ENGINE=InnoDB の記述がありません。

自分のコード:
----------

----------
mysql> create table tes1 (
t1_col1 int (4),
t1_col2 varchar (10),
primary key (t1_col1)
)engine=innodb;

mysql> desc tes1;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| t1_col1 | int(4) | NO | PRI | 0 | |
| t1_col2 | varchar(10) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
mysql> select*from tes1;
+---------+---------+
| t1_col1 | t1_col2 |
+---------+---------+
| 1 | Upd |
| 2 | Upd |
+---------+---------+

----------

----------
mysql> create table tes2(
t2_col1 int (4),
t2_col2 varchar (10),
t1_col2 varchar (10),
primary key (t2_col1),
foreign key (t1_col2) references tes1 on update cascade
);

mysql> desc tes2;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| t2_col1 | int(4) | NO | PRI | 0 | |
| t2_col2 | varchar(10) | YES | | NULL | |
| t1_col2 | varchar(10) | YES | MUL | NULL | |
+---------+-------------+------+-----+---------+-------+
mysql> select*from tes2;
+---------+---------+---------+
| t2_col1 | t2_col2 | t1_col2 |
+---------+---------+---------+
| 1 | line11 | Upd |
| 2 | line22 | Upd |
+---------+---------+---------+

これで親の t1_col2 を更新して、子のテーブルを見ると何も変わっていません。何か無茶をしでかしている気はするんですが、いかんせん経験不足で原因が掴めません。どなたかアドバイスいただけると有り難いです。

宜しくお願いします。orz

投稿日時 - 2009-05-31 01:22:13

QNo.5004266

すぐに回答ほしいです

質問者が選んだベストアンサー

いくつか間違いというか、誤解があるようです。

(1)MySQLでの外部キー制約は、InnoDBのみ
 →MySQLの実装上の制限
(2)子の外部キーは、親のprimary key(ユニークなキー)
 →そうでないなら、親を一意に決められない

まず、子のtes2表は、InnoDBになっていないのでは?

show table status like 'tes%';
show create table tes2;

で確認できます。明示指定しないと、MyISAMが過程されるはずです。

次に、tes1表のt1_col2は、主キーになっていません。

以下に定義&テスト例を貼り付けておきます。

-- 存在したら削除
drop table if exists tes2; -- 削除等は、子の表を先に!
drop table if exists tes1;

-- 表の定義
create table tes1
(t1_col1 int (4),
t1_col2 varchar (10),
primary key (t1_col2) -- 変更
)
engine=innodb;

create table tes2
(t2_col1 int (4),
t2_col2 varchar (10),
t1_col2 varchar (10),
primary key (t2_col1),
foreign key (t1_col2)
references tes1(t1_col2) -- 対応列の明示指定
on update cascade
)
engine=innodb; -- 追加

-- 定義内容確認
show table status like 'tes%';
show create table tes2;

-- テストデータ格納(親)
insert into tes1 values
(1,'upd1'),
(2,'upd2');

-- テストデータ格納(子)
insert into tes2 values
(1,'line11','upd1'),
(2,'line22','upd2');

-- 外部キー制約のテスト
-- 親の主キー更新
update tes1 set t1_col2='upd11' where t1_col2='upd1';

-- 子の外部キーも更新されていることを確認
select * from tes1;
select * from tes2;

投稿日時 - 2009-05-31 16:09:42

お礼

レスが遅くなりまして(^^;)。社会人が通信で『コソ勉』です。丁寧にタグまで頂いて…!有り難うございます!!

そして、動作ですが…むむ、ちゃんと動きます。自分がやると半日調べたり試したり、ブラウザのタブがぎっしりになるまで色々見てやってもダメだったのに(泣)なんでだー!<経験と脳力
悲しいくらいサクサク動きます…。分かっている人がやるとこうも違う物なんですかね。勝手ながら師匠と仰がせて頂きます。orz

でも、おかげさまで肝心の課題制作に入れます。なるべく自力で!とは思うのですが、いかんせん毎週締め切りがあるので、時間が足りなくなってはgooに泣きつくのがパターン化しつつあります。このたびは助けて頂き、有り難うございました。m(_ _)m

れざ

投稿日時 - 2009-06-02 05:19:59

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問