0

PHPとMySQLを使用しています

次のレイアウトを持つ 2 つのテーブルがあります: (この問題に関連しない他のフィールドがあります)

QUESTIONS Q_ID, int, auto incrementing, primary key Question, varchar(255)

ANSWERS A_ID, int, auto incrementing, primary key Q_ID, int Key, varchar(255) D1, varchar(255) D2, varchar(255) D3, varchar(255) D4, varchar(255)

次のレイアウトの CSV ファイルがあります。

NULL, Question, Key, D1, D2, D3, D4 -- The NULL is for the Q_ID autoincrement field.

QuestionsCSV ファイルのデータを関連する 2 つのテーブルに挿入し、1 対多の関係で結合したいと考えていますAnswers。注: NULL と質問は質問テーブル (1 行) に入ります。キー、D1、D2、D3、および D4 は回答テーブルに入りますが、それぞれが対応する質問にリンクする Q_ID を持つ個別のレコードになります。

CSV を読み取り、$array正常に動作するファイルを作成するファイルがあります。

をループして、複合句を$array含む単一のINSERTステートメントを作成する場合VALUES、すべての質問を 1 つのクエリに挿入します。つまり、

INSERT INTO Questions 
    (Q_ID, Client_ID, Question, Key, D1, D2, D3, D4)
VALUES 
    ('$arr[0][1]', '$client_ID', '$arr[0][2]', '$arr[0][3]', '$arr[0][4]', '$arr[0][5]', '$arr[0][6]'' )
    ('$arr[1][1]', '$client_ID', '$arr[1][2]', '$arr[1][3]', '$arr[1][4]', '$arr[1][5]', '$arr[1][6]'' )
    ('$arr[2][1]', '$client_ID', '$arr[2][2]', '$arr[2][3]', '$arr[2][4]', '$arr[2][5]', '$arr[2][6]'' )
    ('$arr[n][1]', '$client_ID', '$arr[n][2]', '$arr[n][3]', '$arr[n][4]', '$arr[n][5]', '$arr[n][6]'' );

マルチユーザー環境では、レコードが多数ある場合でも、自動インクリメントQ_IDフィールドがこれらのレコードに対して連続していると期待できますか? トランザクションとしてこれを行うことはそれを処理しますか? sが連続していることを確認できればQ_ID、実行するクエリの数を大幅に減らすことができ、はるかに効率的になります。それとも、このタイプのパフォーマンスについて心配するのは非生産的ですか?

次に、挿入の実行後に収集Q_IDされた行数から挿入された行数を差し引くことで、最初の数を計算できます。Answers テーブルに s をlast_insert_id作成する際に、新しい行ごとにインクリメントして使用します。INSERT

シングル ユーザー開発環境ではこれをテストできません。もちろん、Q_IDs は常に連続しています。

Q_IDが連続しているとは思えない場合は、「質問」に1回挿入し、 getlast_insert_idを実行してから、CSVの各行の回答に複数VALUES句を挿入する必要があるようです。INSERT

ここでは示しませんが、mysql_real_escape_string を使用して、これら 2 つの方法のいずれかでこのユーザーが送信したデータを消去します。

それとももっと良い方法がありますか?

arheops は、多くのクエリを使用しないように一時テーブルを作成することを以下に提案しています。INSERT私はその推論を理解していますが、各レコードの回答の複数のレコードINSERTedを質問に変換する方法についての彼の説明を理解していません。

4

1 に答える 1