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

Php 将CSV文件插入两个1到多相关MySQL表的最佳方法,php,mysql,sql-insert,Php,Mysql,Sql Insert,我正在使用PHP和MySQL 我有两个具有以下布局的表:还有其他与此问题无关的字段 问题 Q_ID,int,自动递增,主键 问题,瓦查尔 答复 A_ID,int,自动递增,主键 Q_ID,int 钥匙,varchar255 D1,varchar255 D2,varchar255 D3,varchar255 D4,varchar255 我有一个具有以下布局的CSV文件: 空值、问题、键、D1、D2、D3、D4-空值用于Q_ID自动递增字段 我想将CSV文件中的数据插入到两个相关的表中,即问题和答案

我正在使用PHP和MySQL

我有两个具有以下布局的表:还有其他与此问题无关的字段

问题 Q_ID,int,自动递增,主键 问题,瓦查尔

答复 A_ID,int,自动递增,主键 Q_ID,int 钥匙,varchar255 D1,varchar255 D2,varchar255 D3,varchar255 D4,varchar255

我有一个具有以下布局的CSV文件:

空值、问题、键、D1、D2、D3、D4-空值用于Q_ID自动递增字段

我想将CSV文件中的数据插入到两个相关的表中,即问题和答案,并以一对多的关系连接。请注意: 空&问题进入问题表1行 键、D1、D2、D3和D4进入答案表,但作为单独的记录,每个记录都有一个Q_ID,该ID链接回匹配的问题

我有一个文件可以读取CSV并创建一个正常工作的$array

如果我在$array中循环创建一个带有复合值子句的INSERT语句,那么我会在一个查询中插入所有问题,即

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,我可以通过更少的查询来提高效率。还是担心这种类型的性能会适得其反

然后,我将能够通过从插入执行后收集的最后一个插入ID中减去插入的行数来计算第一个Q_ID号。我将使用它,为每一个新行递增它,在创建到Answers表中的insert时使用它

我无法在我的单用户开发环境中测试这一点。当然,这里的Q_id总是连续的

如果我不能指望Q_id是连续的,那么我似乎必须在问题中插入一个,获取最后一个,然后在CSV中的每一行的答案中插入一个多值子句

虽然我没有在这里展示,但我将使用mysql\u real\u escape\u字符串以这两种方法中的任何一种来清理用户提交的数据

还是有更好的办法


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

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

注意,serialautoincrement值并不总是一个接一个。在特定环境下,可以是+2或+3差异

通常我喜欢这样:

1在一个表中导入所有内容

2做 插入表1字段1,字段2,…字段n选择字段1,字段2,。。。温度表中的字段n

3之后,将table1和temp_表连接起来以获得ID,并创建select以插入到table2中


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

尝试循环和字符串连接OK,我想我应该使用LOAD DATA INFILE将数据放入临时表?在什么时候清理用户提交的CVS文件中的数据。如果我在临时文件上有一个索引,并且仍然做两个单独的插入,这会更快,还是更容易?以插入的形式插入到tab1field1,field,…fieldn值1,2,…n,11,22。。nn。。。;所以,检查一下这一步。或者加载数据,但需要特殊权限。速度会更快,因为您确实批量选择了每个表。最后一个插入id不是每次新查询都那么快。我不明白。一旦我有了临时表中的数据,其中问题、键和所有干扰都是同一记录中的字段,我如何创建你说要使用的插入命令?你需要创建两个选择:第一个选择用于将got INSERT插入到第一个表中,第二个选择用于将got INSERT插入到秒中,使用lookupusing join for IDs在第一个选择中。如果仔细创建这两个quarie,它将比您的变体处理大量小查询的速度快得多。