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.
Questions
CSV ファイルのデータを関連する 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_ID
s は常に連続しています。
Q_IDが連続しているとは思えない場合は、「質問」に1回挿入し、 getlast_insert_id
を実行してから、CSVの各行の回答に複数VALUES
句を挿入する必要があるようです。INSERT
ここでは示しませんが、mysql_real_escape_string を使用して、これら 2 つの方法のいずれかでこのユーザーが送信したデータを消去します。
それとももっと良い方法がありますか?
arheops は、多くのクエリを使用しないように一時テーブルを作成することを以下に提案しています。INSERT
私はその推論を理解していますが、各レコードの回答の複数のレコードINSERTed
を質問に変換する方法についての彼の説明を理解していません。