从CSV文件插入两个1到多个相关MySQL表的最佳方法

时间:2013-04-22 04:22:42

标签: php mysql sql-insert

我正在使用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个相关的表QuestionsAnswers中,并加入一对多关系。注意:      NULL&问题进入问题表(1行)      键,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中插入的行数来计算第一个last_insert_id数字。我将使用它,为每个新行递增它,在Answers表中创建INSERT

我无法在单用户开发环境中测试它。当然,Q_ID总是连续的。

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

虽然我没有在这里显示,但是我将使用mysql_real_escape_string来清除这两种方法中的任何一种用户提交的数据。

或者有更好的方法吗?

arheops在下面建议我创建一个临时表以避免使用许多查询。我理解这个推理,但是不理解他对如何INSERT每个记录INSERT的答案中的多个记录进入问题的解释。

1 个答案:

答案 0 :(得分:0)

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

注意,串行(自动增量)值并不总是一个接一个。在conccurent环境中可以+2或+3差异。

通常我喜欢这样:

1)在一个表中导入所有

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

3)之后,连接table1和temp_table以获取ID并创建select以插入到table2中。

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