【问题标题】:php mysql assign the next sequence number to the rowphp mysql 将下一个序列号分配给该行
【发布时间】:2013-03-11 08:33:53
【问题描述】:

我正在使用 mysql 和 PHP。我有一张这样的学生桌。我正在使用 InnoDB 引擎。

id    int  AUTO_INCREMENT
regno int
name varchar

每当插入新学生时,我都想分配下一个可用的 regno。例如,前一个学生的 regno 是 1,那么下一个条目的值应该是 2。自动增量在这里不起作用,因为它可能会产生间隙。 (我正在使用事务,因此在向学生表插入一行后,可能会导致回滚的查询很少,在这种情况下,虽然没有插入实际记录,但自动增量 id 会增加)。另外,我不在乎旧 regno 之间是否存在间隙……例如 regno 可能依次具有 1、2、3、5、10、11、12。现在当插入下一个学生时,我希望这个学生 12+1=13。另外,我想确保 regno 不重复。 (虽然 regno 有一个 UNIQUE 索引,但我不想抛出错误。它应该得到下一个数字)。

我想到了两个解决方案。 1:(伪代码) 一个。查询数据库 newregno = max(regno)+1 湾。在插入行时将 newregno 分配给学生。

在这种情况下,我只是担心应用程序的 2 个实例可能同时查询数据库并获得相同的 newregno 导致重复。

2:使用触发器...在实际插入行后更新 regno。 (我对触发器的了解不多,但如果有人建议这是一种更好的方法,我会选择它)

有什么建议吗?

编辑--- regno(注册号)在未来可能不是唯一的,但与其他一些列一起是唯一的,例如课程/会话。所以请不要为我提供“自动递增”索引类型的解决方案。

【问题讨论】:

  • 您可以在数据库中为 regno 使用自动增量。
  • @DevangRathod 请完整阅读问题...我已经告诉过自动增量在这里不起作用。
  • 有两列我猜是“唯一”的目的吗
  • 可能是这样的:INSERT INTO table SET regno = ( SELECT MAX(regno) + 1 FROM table);
  • 这里是早上,但对我来说 REGNO 代表注册号,您可以从自动递增的 ID 中获取它,或者如果您想实际计算学生数,请计算行数:]

标签: php mysql innodb


【解决方案1】:

看看这个: http://www.mysqlperformanceblog.com/2011/11/29/avoiding-auto-increment-holes-on-innodb-with-insert-ignore/

Increment 使用不同的算法来计算 id。您需要设置它以避免孔。

【讨论】:

  • @priyolahiri... 这是一篇很棒的文章,我将在未来的开发中使用它,但在当前情况下,我不会使用自动增量(请查看我的编辑)。我认为触发器在我的情况下可能是一个很好的解决方案。
  • 或者作为交易的一部分,您可以执行 SELECT MAX(column_name) FROM table_name;然后在进行新的插入/更新时分配给一个变量并递增?
猜你喜欢
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2020-09-29
相关资源
最近更新 更多