在我的网页中,有一个CSV导入部分。用户可以导入数千条记录。我需要将csv细节插入到2个表中。
第一个表包含基本信息。第二个包含其他附加信息。所以我需要将第一个表的Inserted ID保存到第二个表中。
对于上述要求,我写了2个mysql语句。但是导入需要更多时间。在这里,是否可以使用单个查询将记录插入到2个表中?
请指教。
答案 0 :(得分:1)
试试这种方式..
$main_data = array('dino', 'babu', 'john');
foreach($main_data as $main) {
// Insert main to 1st table
mysql_query("MY INSERT QUERY TO TABLE 1");
// Get the last insert id
$new_id = mysql_insert_id();
// Insert the sub data to 2nd table using the insert id
mysql_query("MY INSERT QUERY TO TABLE 2 USING $new_id ");
}
答案 1 :(得分:1)
您不能一次插入两个表(因为您需要第一个表中的id),但您可以逐个插入第一个,单个查询插入第二个,如下所示:
$main_data = array('data1', 'data2', 'data3');
$new_data = array();
foreach($main_data as $data) {
mysql_query("insert into table1 (data) values ('$data')");
$new_id = mysql_insert_id();
// Save the new id into an array + the data
$new_data[$new_id] = $main;
}
$insert_into = array();
// Create a new insert statement
foreach($new_data as $new_key => $data) {
$insert_into[] . "($new_key, '$data')"
}
$imploded_data = implode(',', $insert_into);
if (count($insert_into) > 0) {
// The result will be something like Insert into `table2` (id, value) values (1, 'data1'), (2, 'data2'),(3, 'data3');
mysql_query("insert into `table2` (id, value) values $imploded_data");
}
答案 2 :(得分:0)
不,你一次只能插入一张桌子。
答案 3 :(得分:0)
使用事务(http://dev.mysql.com/doc/refman/5.0/en/commit.html)来维护数据的原子性。
答案 4 :(得分:0)
由于您尚未共享您的架构,我将以同样的方式告诉您故事:)
我会走这条路
步骤1.old_max_import_id = select max(id) from csv_imports;
步骤2.将数据导入csv_imports
表
步骤3.通过运行以下单个查询
,将相同的数据复制到csv_imports2
insert into csv_imports2(fielda,fieldb,fieldc......)
select fielda,fieldb,fieldc .....from csv_imports
where id > old_max_import_id;
我认为你可以轻松实现这一目标。我假设您正在将{csv数据导入Insertion
的表中。如果您通过csv进口更新,则stragegy将发生显着变化。在这种情况下,csv_imports
表上的插入/更新触发器将对您有所帮助。
答案 5 :(得分:0)
由于您为每行CSV运行查询,因此花费了更多时间。尝试在一次中连接所有SQL语句和exec。
insert into table_one (First, Last) values ('Fred','Smith'),
('John','Smith'),
('Michael','Smith'),
('Robert','Smith');
insert into table_two (First, Last) values ('Fred','Smith'),
('John','Smith'),
('Michael','Smith'),
('Robert','Smith');