テーブルは3つあり、テーブル1とテーブル2はautoincrementなidをもち、テーブル3はそれらのidの対応表です。
テーブル2にinsertするときに同時にテーブル3にもinsertしたいです。
・これを解決する方法
・この設計の問題点と改善案
いずれかご教授ください。
環境はMySQL+Connector/Jです。
show table statusは使わない方向でお願いします。
My Yahoo!
・解決方法
トリガーを使えばいいかと思います。
・問題点
テーブル2にテーブル1のIDを持たせればいいだけではないでしょうか。
My Yahoo!
ポイントは結構です。
多対多であれば、テーブル1にはテーブル2のIDを持たして、
テーブル2にはテーブル1のIDを持たせれば、
外部結合で多対多の関係で抽出は可能です。
例)
select
*
from
table1,table2
where
table1.id = table2.t1ID or
table2.id = table1.t2ID
どうしてもテーブル3にインサートしたいのであれば、
自力でインサートするしかなさそうですね。
この場合、テーブル1、テーブル2ともに似たようなエントリ(参照先が異なるだけのエントリ)が増えませんか?
ディスクの効率とupdateやselectの時のオーバーヘッドが気になります。
テーブル3の利用に関しては絶対ではないのでよりよい方法があればその方法をとろうと思っています。
すみません、もう少しお付き合い願います。。。
http://dev.mysql.com/doc/mysql/ja/Miscellaneous_functions.html
MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.3.6.2 その他の各種関数
LAST_INSERT_ID関数を使えば、AUTO_INCREMENT カラムに挿入された値のうち、最後に自動生成された値を返します。
table2 へ INSERT した後、
INSERT INTO table3 VALUES (LAST_INSERT_ID());
みたいな感じで table3 へ INSERT するのはいかがでしょうか?
なるほど、接続ごとに制御がかかってるんですね。
これなら競合が起こっても正しく動作しそうですね。
ありがとうございます!
今回は考えていないことなんですが、テーブル1とテーブル2を一緒にinsertしたらちょっと破綻しちゃいそうですね。
MySQLはトリガーに対応していないと記憶していますが。
このような構造にしたのはテーブル1とテーブル2を多対多の関係にしたいためです。
なので、テーブル2にテーブル1のIDは持たせられないと思っています。