我正在使用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&问题进入问题表(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
的答案中的多个记录进入问题的解释。
答案 0 :(得分:0)
最好的方法是创建与csv文件相同的临时表,之后创建插入/选择语句来填充表。
注意,串行(自动增量)值并不总是一个接一个。在conccurent环境中可以+2或+3差异。
通常我喜欢这样:
1)在一个表中导入所有
2)做 插入table1(field1,field2,... fieldn)从temp_table中选择field1,field2,... fieldn;
3)之后,连接table1和temp_table以获取ID并创建select以插入到table2中。
注意,对于加速连接需要在连接列上创建索引(问题文本?)