防止在数据库上插入重复的递增值

时间:2015-02-03 05:59:15

标签: php mysql

我正在编写一个程序,用于保存数据库中的金额记录。每个当前插入的数量都依赖于之前保存的金额,并从该值增加。

就像:

select amount from table order by id desc limit 1;

然后我将以当前金额增加可用的最新金额,并将其作为新行插入。

假设数据库中的第一个数量是100,下一个要插入的数量是150,30和70.这就是逻辑的方式:

id  -   amount
1   -   100

id  -   amount
1   -   100
2   -   250 (get previous 100, then add 150)
3   -   280 (get previous 250, then add 30)
4   -   350 (get previous 280, then add 70)

但问题是当我多次执行此过程时(每次点击都会通过ajax触发php进程),它会使一些记录重复,这是错误的:

多次制作流程时会发生什么

id  -   amount
1   -   100
2   -   250 (get previous 100, then add 150)
3   -   130 (get previous 250, then add 30)
4   -   200 (get previous 280, then add 70)

似乎,当我插入 id#3 时,在select上找到的数据库上保存的值仍然是100而250还没有插入,这就是为什么新插入的数据采用较旧的值

是否还有其他方法可以阻止我这样的过程,因此从db中保存重复数量或从旧数量值增加?

到目前为止,我尝试过的是设置一个日期时间,并根据之前保存的日期时间每1秒生成一次请求。还是行不通。也许是因为mysql很慢,我不确定。

感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

我想到了一些建议。

交易。这些将允许您获取最后一行并添加一个新的组作为一个组。 http://www.mysqltutorial.org/mysql-transaction.aspx 虽然我不确定,但我认为这些会对你的情况起作用。

表锁定。 http://dev.mysql.com/doc/refman/5.1/en/lock-tables.html - 这有其自身的优点和缺点。

此外,您可以执行3次查询 - 带有非填充金额的插入,然后返回ID,之前选择该行,然后更新更新金额。像这样(伪代码):

1. insert into table (amount) values (30)
2. get last inserted id (assuming autoincrement else you could use timestamps and get the last row before the timestamp used in #1)
3. select from table where id = (last_inserted_id - 1)
4. update where id=last_inserted_id set amount += (#3 amount)