我正在使用PHP &MySQL
我有两个表与以下布局:(还有其他字段不相关的这个问题)
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
,与一对多关系连接。注意:空,问题进入问题表(1行)键,D1, D2, D3, &D4进入Answers表,但作为单独的记录,每个记录都有一个Q_ID,该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
,我可以通过执行更少的查询来提高效率。还是担心这种类型的表现会适得其反?
然后我将能够通过减去插入执行后收集的last_insert_id
中插入的行数来计算第一个Q_ID
数。在将INSERT
s创建到Answers表中时,我将使用它,并对每个新行进行递增。
我无法在我的单用户开发环境中进行测试。当然,这里的Q_ID
总是连续的。
如果我不能指望q_id是连续的,似乎我必须做一个插入到"问题",得到last_insert_id
,然后做一个多VALUES
子句INSERT
到CSV中的每一行的答案。
虽然我没有在这里显示它,但我将使用mysql_real_escape_string以这两种方法中的任何一种来清理用户提交的数据。
还是有更好的方法?
arheops建议我创建一个临时表,以避免使用许多查询。我理解这种推理,但不理解他对如何将INSERT
中的多个记录中的每个记录INSERTed
的答案转换为问题的解释。
最好的方法是创建与csv文件相同的临时表,然后创建insert/select语句来填充您的表
注意,串行(自动递增)值并不总是一个一个的。在并发环境中可以有+2或+3的差值。
通常我是这样做的:
2)Insert into table1(field1,field2,…)select field1,field2,…
3)然后join table和temp_table来获取id并创建select for insert into table2
注意,为了加速连接需要在连接列(问题文本?)上创建索引