2011-09-06 52 views
0

これは、動作させるための概念草案の一種ですが、完全なクラップコードを持つことは望ましくありません。私のデータベースでは、innoDBを使って真の外部キー関係を取得しようとしましたが、取得できませんでした。テーブルと関連付けるMySQLの外部キー関係とmysql_insert_id

外部キーを使用する代わりに、挿入後にmysql_insert_id()を引っ張って変数として保存し、その変数を関連するテーブルに格納することにしました。

これはひどいですか?すべてがうまくいくように見え、必要に応じてIDの接続や関連付けができます。外部キーを使用すると、どのようなメリットがあるのですか?

+1

あなたが正しく理解していれば、あなたは 'mysql_query( 'INSERT INTO master ...')のようなことをしています。 $ master_id = mysqsl_insert_id(); mysql_query( "INSERT INTO detail(master_id、...)values( '$ master_id'、...)"); '。そうですね、それは恐ろしいことではなく、あなたが関係を作るためにできることは唯一のことです。他の唯一の方法は["natural keys"](http://en.wikipedia.org/wiki/Natural_key)またはアプリケーションで生成されたキーを使用することですが、唯一の違いは、mysql_insert_id 'ではなく、ユーザーからのものです。あなたは外来キーではどういう意味ですか? – vstm

+0

私はmysql_insert_idを使って実際にデータベースに関係をベーキングするのと比較しようとしています: 'ADD CONSTRAINT 'mytable' FOREIGN KEY( 'my_id')REFERENCES 'othertable'( 'other_id')ON CASCADE ON DELET CASCADE; – Ryan

+0

私のコメントを編集するのではなく、あなたの前提を確認してください:はい、まさに私がやっていることです。 – Ryan

答えて

0

リレーション(マスター→詳細)を作成するには、mysql_insert_id、ナチュラルキーまたはアプリケーションで生成されたキーを使用して、常にキーを入力する必要があります。 FOREIGN KEYそのをあなたのために働かせるつもりはありません。

  • (そう、「詳細」のレコードが無効の親を指していません)あなたは関係/あなたのデータの整合性を適用支援

    • であることは、削除またはマスターのキー変更を処理し何FOREIGN KEY

      レコード(ON DELETE ...、ON UPDATE ...)。

    • また、それはまだ存在しない場合は行×「MASTER_ID」のために-tableあなたの「詳細」にインデックスを作成だ
    • (大丈夫、あなたも行うことができ、そのFOREIGN KEYなし)
    • も文書化する目的のいくつかの種類を持っています例えばERM-ツールは、あなたのスキーマからリレーションシップ・モデルを再設計でき(大丈夫、この点はわずかなロングショットである)

    FOREIGN KEY制約文を追加するコストは、その利益に比べて小さいです。

  • +0

    ああ、それは私のためにそれをクリアします。ありがとう、トン! – Ryan

    関連する問題