cakephp检查重复行
我已经做了5天了。我在这里阅读了所有我能找到的答案,我尝试了所有我能找到的选项,但我找不到如何解决这个缓存问题 我正在使用cakephp 2.4.4,它可以升级,但我在change.log中没有看到我的问题 Percona MYSQL 5.6 Innodb 我们有一个在循环中调用以插入行的模型cakephp检查重复行,php,mysql,cakephp,caching,Php,Mysql,Cakephp,Caching,我已经做了5天了。我在这里阅读了所有我能找到的答案,我尝试了所有我能找到的选项,但我找不到如何解决这个缓存问题 我正在使用cakephp 2.4.4,它可以升级,但我在change.log中没有看到我的问题 Percona MYSQL 5.6 Innodb 我们有一个在循环中调用以插入行的模型 App::import('Model', 'TableA'); $TableA = new TableA(); foreach($rows as $row){ $TableA->Insert
App::import('Model', 'TableA');
$TableA = new TableA();
foreach($rows as $row){
$TableA->InsertRow($row);
}
然后我们有了TableA的模型
我在tabla.Sku上添加了一个唯一的索引,以避免重复条目
class TableA extends AppModel {
var $name = 'TableA';
var $cacheQueries = false;
var $validate = array();
function InsertRow($data){
$this->clear();
try {
$result = $this->find('first', array(
'fields' => array(
'TableA.id',
),
'conditions' => array(
'TableA.Sku' => $data['Sku'],
),
));
pr($result);
if(!isset($result['TableA']['id'])){
$data['TimeStamp'] = strtotime("now");
$this->save($data);
}
return TRUE;
}
catch (Exception $e) {
pr($e);
$resultNow = $this->find('first', array(
'fields' => array(
'TableA.id',
),
'conditions' => array(
'TableA.Sku' => $data['Sku'],
),
));
pr($resultNow);
}
}
}
第一个循环$Rows具有多个相同sku的时间顺序
第一个循环插入行
第二个循环给出:
array
(
)
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'tue026991015' for key 'Sku'
INSERT INTO `ki`.`TableA` (`Sku`, `TimeStamp`) VALUES ('tue026991015', 1453858976)
Array
(
[TableA] => Array
(
[id] => 31951
)
)
我也在调试模式2下运行
在第二个循环中,查询应该返回id,循环不应该尝试插入行,但事实并非如此。
我添加了var$cachequerys=false;在模型的顶部,以避免兑现。我不知道为什么会发生这种行为,以及如何避免mysql为这个功能兑现。它发生在用户单击“刷新”数据时,或者在您填写表单并添加用户数据时?您使用哪种方法收集GET或POST数据?当用户单击“刷新”数据时,或者当您填写表单并添加用户数据时,会发生这种情况?您使用哪种方法收集GET或POST数据?数据数组是从提供数组的API调用加载的。该数组有重复项,但我们希望表中的值是唯一的。因此,我们在插入之前测试表中是否已经存在Sku。例外情况是,我们有一个唯一的索引(现在已经修复了重复的问题),但这仍然不应该发生。该数组有重复项,但我们希望表中的值是唯一的。因此,我们在插入之前测试表中是否已经存在Sku。例外情况是,我们有一个唯一的索引(现在修复了重复的问题),但这仍然不应该发生。为什么不使用验证规则来测试
Sku
是唯一的,而不是重新发明轮子?如果Sku
始终需要唯一table a
应在Sku
字段上使用isUnique
验证规则,如果该规则已经存在,则会导致保存
失败。这将大大简化您的代码。添加验证的工作原理与在mysql表上添加唯一索引的工作原理相同,这就是我所使用的解决方法。这确认find('first')正在使用缓存。。。。。这里真正的问题是如何禁用find('first')缓存添加验证规则与在表上添加唯一索引不同。验证规则将首先检查数据库是否尚未使用该值,并将阻止save查询运行(以及标记错误),仅在表上添加唯一索引不会阻止Cake运行查询,这将导致抛出您看到的MySQL错误。您确实应该将此作为验证规则来执行,否则在尝试保存数据时将无法捕获这些错误。关于缓存,您确定会发生这种情况吗?您是否检查了查询日志以查看查询是否只运行了一次?我同意这一点,并开始实施验证。为什么不使用验证规则来测试Sku
是否唯一,而不是重新发明轮子?如果Sku
始终需要唯一table a
应在Sku
字段上使用isUnique
验证规则,如果该规则已经存在,则会导致保存
失败。这将大大简化您的代码。添加验证的工作原理与在mysql表上添加唯一索引的工作原理相同,这就是我所使用的解决方法。这确认find('first')正在使用缓存。。。。。这里真正的问题是如何禁用find('first')缓存添加验证规则与在表上添加唯一索引不同。验证规则将首先检查数据库是否尚未使用该值,并将阻止save查询运行(以及标记错误),仅在表上添加唯一索引不会阻止Cake运行查询,这将导致抛出您看到的MySQL错误。您确实应该将此作为验证规则来执行,否则在尝试保存数据时将无法捕获这些错误。关于缓存,您确定会发生这种情况吗?您是否检查了查询日志以查看查询是否只运行一次?我同意这一点,并开始实施验证。