我有一个场景,我需要找到一个高于最后一个最高数字的数字,然后将该数字插入到新行中,并且必须根据 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 文件夹中删除,但没有效果。
谢谢大家。
最佳答案
显然您正在尝试创建所谓的“无间隙序列”。
但是,由于您使用两个单独的查询来实现这一点(首先计算 max(x) + 1,然后使用该值插入新记录),因此您面临着机会的风险计算出的值不再是正确的值;在您计算新数字和插入新记录之间,其他人可能创建了一条新记录。
更好的选择可能是让数据库在插入期间为您计算值。您可以使用“触发器”来做到这一点; Stackoverflow 上的这个问题做了类似的事情,并且可能为您提供实现此目标的正确指示;
MySQL trigger to set column to max + 1 not working
将创建新 ID 的责任留给数据库还有一个优点,无论您使用什么工具插入数据,数据库将始终确保正确的 ID/序列已生成。
因此,即使您通过 MySQL shell 或使用 PhpMyAdmin 插入新记录,数据库也会自动生成新编号。
关于php - cakephp查询1.1中MYSQL Max记录不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14999896/