我正在使用 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.
我想将 CSV 文件中的数据插入到 2 个相关表中,Questions
并且Answers
以一对多关系连接。请注意:NULL & Question 进入 Questions 表(1 行) Key、D1、D2、D3 和 D4 进入 Answers 表,但作为单独的记录,每个都有一个 Q_ID 链接回其匹配的问题。
我有一个文件,它读取 CSV 并创建一个$array
正常工作的文件。
如果我循环创建带有复合子句$array
的单个语句,那么我将所有问题插入到一个查询中,即INSERT
VALUES
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
这些记录的自动增量字段是连续的,即使它们有很多?将其作为交易进行处理吗?如果我可以确定连续Q_ID
的 s,我可以通过少得多的查询来提高效率。还是担心这种类型的性能会适得其反?
然后,我将能够通过在插入执行后从聚集Q_ID
中减去插入的行数来计算第一个数字。在将s 创建到 Answers 表last_insert_id
中时,我将使用它,为每个新行递增它。INSERT
我无法在我的单用户开发环境中对此进行测试。当然,那里的Q_ID
s 总是连续的。
如果我不能指望 Q_ID 是连续的,看来我必须在“问题”中插入一个,获取last_insert_id
,然后在 CSV 中的每一行的答案中执行一个多VALUES
子句。INSERT
虽然我没有在这里展示它,但我将使用 mysql_real_escape_string 来清理这个用户在这两种方法中提交的数据。
或者,还有更好的方法?
arheops 在下面建议我创建一个临时表以避免使用许多查询。我理解这种推理,但不理解他对如何将INSERT
Answers 中的多个记录为每个记录INSERTed
转换为 Questions 的解释。