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.

我想将 CSV 文件中的数据插入到 2 个相关表中,Questions并且Answers以一对多关系连接。请注意:NULL & Question 进入 Questions 表(1 行) Key、D1、D2、D3 和 D4 进入 Answers 表,但作为单独的记录,每个都有一个 Q_ID 链接回其匹配的问题。

我有一个文件,它读取 CSV 并创建一个$array正常工作的文件。

如果我循环创建带有复合子句$array的单个语句,那么我将所有问题插入到一个查询中,即INSERTVALUES

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_IDs 总是连续的。

如果我不能指望 Q_ID 是连续的,看来我必须在“问题”中插入一个,获取last_insert_id,然后在 CSV 中的每一行的答案中执行一个多VALUES子句。INSERT

虽然我没有在这里展示它,但我将使用 mysql_real_escape_string 来清理这个用户在这两种方法中提交的数据。

或者,还有更好的方法?

arheops 在下面建议我创建一个临时表以避免使用许多查询。我理解这种推理,但不理解他对如何将INSERTAnswers 中的多个记录为每个记录INSERTed转换为 Questions 的解释。

4

1 回答 1

0

最好的方法是创建与 csv 文件相同的临时表,然后创建插入/选择语句来填充您的表。

请注意,serial(autoincrement) 值并不总是一对一的。在并发环境中可以是+2 或+3 的差异。

通常我喜欢这样:

1)在一张表中导入所有内容

2) 插入 table1(field1,field2,...fieldn) 从 temp_table 中选择 field1,field2,... fieldn;

3) 之后连接 table1 和 temp_table 以获取 ID 并为插入 table2 创建选择。

注意,为了加速连接需要在连接列上创建索引(问题文本?)

于 2013-04-22T04:32:47.200 回答