我在我的程序中没有使用事务,所以我认为所有的数据库操作都应该立即提交。
我的php程序查找一个表中的值,如果找到则返回id。如果没有找到,则写入一行新数据。之后它重复执行,应该能够找到我刚刚插入的数据,但实际上没有找到,所以会出现重复错误。
如何强制mysql写入数据,以便在插入后获得有效结果?我尝试过清空表格,但这并没有改变我的结果。
更多细节:
我原以为这是一个普遍的mysql问题,但似乎与使用Cakephp的Model Query有关。
我正在使用控制器将CSV文件解析成多个表格,然后即时绑定模型并使用查询调用将数据插入表格。对于应用程序的其他部分,我使用CakePHP,但解析功能只是一种临时功能,所以我没有花费很多时间来使其优雅。
导入模型没有关联的表格,因此我手动绑定到Tracking模型。
下面是相关查询代码的意思:
$this->Import->bindModel(array('hasOne' => array('Tracking')));
$insert =<<<DONE
INSERT INTO tracking (id, created, employee_id, client_id, borrower_name, loan_number,
loan_amount, activity_id, program_id, rate_id, lock_period,
lo_price, investor_price, committed_price, purchase_advice_price,
lock_type, investor_id, time_taken, notes,audited,audit_notes,
import_notes, import_error, uniqueness)
VALUES (NULL, '%s', %d, %d, '%s', '%s',
%.2f, %d, %d, %d, %d,
%.5f, %.5f, %.5f, %.5f,
%d, %d, %d, '%s', %d, '%s',
'%s', %d, %d)
DONE;
while ($row = fgetscsv($fh))
# Lots of processing deleted
if (! $this->_exists($row))
{
$sql = vsprint($insert, $row);
$this->Import->Tracking->query($sql); # This is where I'll get a duplicate error
}
} # end of function
# I've created a unique index on columns that should be unique and I do the query on
# them here.
private _exists($mydata)
{
$find = "SELECT id FROM tracking WHERE created = '%s' AND employee_id = %d" AND
activity_id = $d AND ...";
$sql = sprintf($find, $mydata[0], $mydata[1]);
return $this->Import->Tracking->query($sql);
}
看起来问题似乎与Cakephp及其对模型查询的处理有关。
我可能可以将此代码从Cake中移出并使用一个独立的PHP程序,但既然我已经在使用Cakephp,我想我会把导入模型放进去。
额外的评论:选择是正确的,但我没有逐字记录下来,因为它很长,我用省略号表示了。它可以正常工作,因为我可以将其复制/粘贴到mysql会话中并选择数据。第二次运行它,它将找到数据。
听起来Cakephp可能会将整个事物包装成一个大的事务,直到退出控制器才提交。这是否解释了为什么第二次运行它会发现那些行?
我想我需要弄清楚如何让Cakephp提交这些插入或者也许我不应该使用Model->query来完成这个操作,或者不要在我的项目的这一部分中使用Cakephp。
====
谢谢!
SELECT
语句有误。你的INSERT和SELECT语句是什么样子的? - Brendan Long