0

我有一个场景,我需要找到一个高于最后一个最高数字的数字,然后将该数字插入新行中,并且必须根据 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 文件夹中删除,但没有效果。

谢谢大家。

4

2 回答 2

1

显然,您正在尝试创建所谓的“无缝序列”。

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

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

MySQL触发器将列设置为max + 1不起作用

将创建新 ID 的责任留给数据库还有一个好处是,无论您使用什么工具插入数据,数据库都将始终确保生成正确的 ID/序列。

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

于 2013-02-21T23:28:23.270 回答
0

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

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

谢谢大家。

于 2013-02-21T13:42:10.937 回答