cakephp查询1.1中MYSQL Max中的记录不正确

时间:2013-02-21 10:27:19

标签: php mysql cakephp

我有一个场景,我需要找到一个高于最后一个最高数字的数字,然后将该数字插入一个新行,并且必须完成两次,具体取决于2个if语句 我正在使用mysql max 像:

if(condtn1){
    $maxNum = $this->model->query('SELECT SQL_NO_CACHE max(qte_number) + 1 as newQuoteNumber FROM qtes LIMIT 1');
 $this->model->save($data) // the max number caluclated above inserts here and is visible in DB
}
if(condtn2){
    $maxNum = $this->model->query('SELECT SQL_NO_CACHE max(qte_number) + 1 as newQuoteNumber FROM qtes LIMIT 1');
 $this->model->save($data); //simillar case with some values different in data array 
}

我假设在第一个条件中保存的号码现在将作为第二个条件中我需要的号码的基础。 就像第一个生成200并且它被保存在数据库中所以它应该是201在第二个条件但它在两个中都保持200。 我尝试了一些缓存选项来禁用缓存,如

$this->cacheQueries = false; 

并手动将其从tmp文件夹中删除但不起作用。

Thanx all。

2 个答案:

答案 0 :(得分:1)

显然你正试图创造一种所谓的'无间隙序列'。

但是,因为你使用两个单独的查询来实现这一点(首先计算max(x)+ 1,然后然后使用该值来插入新记录),你冒着风险计算出的值不再是正确的值;在您计算新号码和插入新记录的那一刻之间,其他人可能会创建新记录。

更好的选择可能是让数据库在插入期间为您计算值。您可以使用“触发器”执行此操作; Stackoverflow上的这个问题做了类似的事情,可能会给你正确的指针来实现这个目标;

MySQL trigger to set column to max + 1 not working

将责任创建到数据库的新ID也具有以下优势:无论您使用什么工具来插入数据,数据库都将始终确保正确的ID / sequence生成。

因此,即使您通过MySQL shell或使用PhpMyAdmin插入新记录,数据库也会自动生成新号码。

答案 1 :(得分:0)

我找到了一种方法来完成这项工作。 这是一个缓存问题,查询函数中有第二个参数需要设置为不缓存查询 像

$this->model->query($qry,false);

Thanx all。