3

そのため、vb.net で Web アプリを作成していますが、特定のデータベースの問題で概念的に少し困惑していることに気付きました。

基本的に、フォームには 2 つの異なる「テンプレート」があります。1 つは、ユーザーが多数のテキスト フィールドに入力して送信すると、すべてがデータベースに送信されます。2 番目のテンプレートは同じですが、いくつかの追加情報を追跡するため、データベースにさらに送信します。多数の重複する列を含むテーブルのペアや、多数の null を含む単一のテーブルを作成するのではなく、両方のテンプレートで共有されるすべての情報を追跡する 1 つのテーブルと、2 番目のテンプレートのすべての「余分なもの」を格納する別のテーブルを作成しました。もっている。

これにより発生した問題は、フォームを検索してデータベースから情報を引き出すために、2 つのデータをペアにする方法が必要なことです。集合フォームは、「共有」テーブルの主キーである代理自動インクリメント キーによって識別されます。「extra stuff」テーブルとの外部キー関係を設定しようとしましたが、そうするとアプリケーション側で問題が発生し、insert ステートメントで自動インクリメントを参照する外部キーを処理する方法がわかりません。

コード例を示すには:

    Dim sInsertInto As String
    sInsertInto = "INSERT INTO 5why (date, op_id, serial, why1, why2, why3, why4, why5, root_cause, other_notes, lessons, define, template) VALUES (" + _
    "'" + f_date + "', " + _
    " '" + f_usr + "', " + _
    " '" + f_partnum + "', " + _
    " '" + f_first + "', " + _
    " '" + f_second + "', " + _
    " '" + f_third + "', " + _
    " '" + f_fourth + "', " + _
    " '" + f_fifth + "', " + _
    " '" + f_root + "', " + _
    " '" + f_notes + "', " + _
    " '" + f_lessons + "', " + _
    " '" + f_define + "', " + _
    " '" + f_temp + "'" + _
    ")"

    Dim sInsertInto2 As String
    sInsertInto2 = "INSERT INTO 5why_mbusi (countermeasure, containment, check_it, standardize_counter, point_cause, method_procedure, group_leader, engineer, shop_am, shop_manager) VALUES (" + _
    "'" + f_counter + "', " + _
    " '" + f_containment + "', " + _
    " '" + f_check + "', " + _
    " '" + f_standardCounter + "', " + _
    " '" + f_pointOfCause + "', " + _
    " '" + f_methodAndProc + "', " + _
    " '" + f_groupLeader + "', " + _
    " '" + f_engineer + "', " + _
    " '" + f_shop_A_M + "', " + _
    " '" + f_shopManager + ", '" + _
    ")"

最初の挿入ステートメントでは、すべての共有情報を「共有」テーブルに挿入しています。ここでは自動インクリメントについて心配する必要はありません。これはすべてデータベースによって処理されるためです。2 番目の挿入ステートメントは、すべての余分なものを「余分なもの」テーブルに送りますが、関係を確立する目的で null にすることはできないため、外部キーに入れるものを考え出さずにこれらすべてのものを挿入することはできません。 2 つのデータセットの間。外部キーを AI に設定するだけでも「1」からやり直すだけで、「共有」テーブルによって生成される AI と一致しないという印象を受けています。

それを処理する方法についてのアイデアはありますか?これは言葉にするのが少し難しいので、何か説明が必要な場合はお知らせください。解決できるよう最善を尽くします。

4

1 に答える 1

2

これを処理する標準的な方法は、2 番目のテーブルがその主キーを自動インクリメントとして宣言しないことです。代わりに、INSERT ステートメントで主キーの値を指定する必要があります。

最初のテーブルの直後に 2 番目のテーブルに挿入する場合、特殊関数 LAST_INSERT_ID() を値として使用できます。

例:

INSERT INTO table1 (foo) VALUES (1234);  -- generates a new `id`

INSERT INTO table2 (id, bar) VALUES (LAST_INSERT_ID(), 'abcd');

LAST_INSERT_ID() 関数は、同じセッション内の以前の INSERT ステートメントによって生成された最新の自動インクリメント値を返します。他のセッションで独自の挿入を行っている他の人がこれを妥協する可能性はありません。

PS:これは元の質問とは別の問題ですが、FWIW フォーム フィールドを文字列連結でつなぎ合わせるのではなく、クエリ パラメータを使用する方法を学ぶ必要があります。パラメータを使用すると、より簡単に、より速く、より安全に使用できます。

于 2013-09-16T19:56:24.663 に答える