cakephp检查重复行

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

我已经做了5天了。我在这里阅读了所有我能找到的答案,我尝试了所有我能找到的选项,但我找不到如何解决这个缓存问题

我正在使用cakephp 2.4.4,它可以升级,但我在change.log中没有看到我的问题 Percona MYSQL 5.6 Innodb

我们有一个在循环中调用以插入行的模型

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错误。您确实应该将此作为验证规则来执行,否则在尝试保存数据时将无法捕获这些错误。关于缓存,您确定会发生这种情况吗?您是否检查了查询日志以查看查询是否只运行一次?我同意这一点,并开始实施验证。