1

3 つのテーブルがあります。

masterCat
category
subCat

Master cat は単純に 2 つの列idを持ち、name

後続のテーブルには、id、 、nameおよびの 3 つの列があります。mapsTo

当然のことながら、表のmapsTo列はこのカテゴリがどのカテゴリに属しているかを示し、階層的なカテゴリ構造を作成しています。categorymasterCat

ユーザーが新しいカテゴリを追加するなど、カテゴリを更新および修正できるようにするスクリプトを作成しようとしています。

したがって、新しい構造が作成された場合:

newMasterCat > newCategory > newSubCategory

非常に多くのコード行を持たずにMySQLでこれを記述するにはどうすればよいですか?これが必要なことです:

  1. 各テーブルに新しい行を作成します (1 つのトランザクションとして 3 つの挿入、問題ありません)。
  2. これらの行に戻ってmasterCatcategoryテーブル修正に割り当てられた ID を見つけます。
  3. 親テーブルで作成されたレコードの ID で新しい行を更新しcategoryますsubCat

これを 3 段階で行うことができますが、より迅速な方法はありますか?

(VB.net で MySQL データベースと MySQL ドライバーを使用)

4

1 に答える 1

1

LAST_INSERT_ID()関数を使用してこれを実現できます: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

この関数の結果は現在の接続にスコープされ、他の同時挿入の影響を受けません。したがって、挿入は次のようになります。

INSERT INTO masterCat (name) VALUES ('masterCat1');

INSERT INTO category (name, mapsTo) VALUES ('Cat1', LAST_INSERT_ID());

そして最後に、これを同じ方法で 3 回連鎖させることができます。

INSERT INTO subCat (name, mapsTo) VALUES ('SubCat1', LAST_INSERT_ID());

これらのステートメントを VB.NET で実行する方法について誰かがコメントできますが、単一の呼び出しで個別のステートメントを実行するストアド プロシージャを作成する必要がある場合がありますExecuteNonQuery()

余談ですが、多くの人は、複数の DB ラウンド トリップを防止することに多くの時間を費やしていますが、これは、気にする必要があるボトルネックではありません。

于 2013-02-14T16:38:17.337 に答える