我有一个临时表(来自旧系统的转储,有一长串许多细节),大约有8k条记录,我需要将其分解,使用一些逻辑并将数据插入3个不同的表中。
table_temp (id, name, address, email, phone, mobile, etc......)
tbluser (id, username, password, roleid, status)
tblstudent (id, userid, name, address, classid, sectionid, etc.....)
tblstudentdetails(id, studentid, address, contact details....)
因为我需要获取数据,所以放置一些逻辑并为所有这些表创建单独的insert语句。我试图创建大型插入语句,如:
INSERT INTO `tbluser`(`instsessassocid`, `username`, `password`, `roleid`, `status`) VALUES
('1','PRAGUN10000@temp.com','$2y10$gFscDWwWKR8Iven6R','3','1'),
('1','SONAM10001@temp.com','$2y10$gFscDWwWKR8Iven6R','3','1'),
('1','SONAM10001@temp.com','$2y10$gFscDWwWKR8Iven6R','3','1')
其他表也一样(你明白了):
INSERT INTO `tblstudent`(`scholarnumber`,`firstname`, `middlename`,`lastname`) VALUES
('10000','PRAGUN','','TANWAR'),('10001','SONAM','','-'),
('10002','HITESH','','KUMAR'),('10003','KHUSHI','','MEHTA'),
('10004','ADITYA','','VASYANI')
创建4个大型插入语句后,我将它们存储在一个数组中并将其发送到我的插入函数,该函数推迟自动提交,获取每个插入语句,一旦一切正常,提交并应返回插入ID等。
我的应用程序似乎超时(目前设置为默认/ 30秒),当然这么小的插入不应该超时,任何人都可以指出我做错了什么或我如何改进。
这是我的插入功能:
function dbInsert($sql) {
if (is_array($sql) == 0) {
$sqlarray[] = $sql;
} else {
$sqlarray = $sql;
}
$sqlCount = count($sqlarray); //echoThis($sqlCount); die;
$con = dbConnect();
$insertID = array();
try {
// begin a transaction
$con->autocommit(FALSE);
/* commit transaction */
foreach ($sqlarray as $value) {
if ($con->query($value)) {
$insertID[] = $con->insert_id;
} else {
trigger_error(mysqli_error($con));
}
}
// if no error, commit.
if ((!mysqli_error($con)) || (!mysqli_commit($con)) && ($sqlCount === count($insertID))) {
$con->commit(); //mysqli_commit($con);
} else {
$con->rollback();
trigger_error("Error in dbInsert: " . mysqli_error_list($con));
$con->close();
}
} catch (Exception $e) {
// if any error, catch the exception and rollback
$con->rollback();
trigger_error("Error in dbInsert:" . $e);
}
/* close connection and return the result */
$con->close();
return $insertID;
}
这只是一个测试,一旦排序我需要导入相当多的记录,所以我想要“准备好的脚本”,我可以根据需要使用它。
我知道负载infile或mysqlimport方式,但我需要逻辑,我真的认为我的脚本应该能够完成这项工作。请注意,我在我的本地主机上,没有其他任何事情发生在合理的配置机器上。
谢谢!
答案 0 :(得分:0)
对于你正在做的事情,似乎没有任何内在错误。但是,根据您的说法,数据已经在一行中的表中。所以也许你可以让MySQL为你而不是PHP做逻辑。这就是我的意思:
1)根据需要在第一个临时表中添加任意数量的字段,这样您就可以获得所需的信息
2)这是一个解决方案,允许您拆分具有给定分隔符的字符串:
Split value from one field to two
你在这里做的是像这样的查询
UPDATE myTable
SET newField1 = SUBSTRING_INDEX(SUBSTRING_INDEX(membername, ' ', 1), ' ', -1),
newField2 = SUBSTRING_INDEX(SUBSTRING_INDEX(membername, ' ', 1), ' ', -1),
....
最后,您想要的是将您的数据拆分为所有不同的字段,而不仅仅是一个大字段。
4)最后,你可以这样做:
INSERT INTO tbluser
SELECT field1, field2, field3 FROM myTable
一旦数据在适当的表格中,您就可以运行一系列更新,以便修复使数据适合生产所需的任何逻辑。我不知道这是否比批量插入更快,但我认为值得一试。