我有一个 InooDB 表:

  • id - 主键,自增
  • short_code - varchar(6),唯一的
  • 其他一些列
  • short_code 总是基于 id 在 php 中生成。
    问题是我无法在插入记录之前生成 short_code ,因为我不知道 id

    我尝试了以下方法:
  • 插入一个空的short_code
  • 的记录
  • 使用 mysqli_insert_id 或 pdo 获取插入行的 ID,无论
  • 根据 id 生成短代码,并用新的短代码
  • 更新记录

    这有效,但这真的很慢。我必须进行插入和更新,这很耗时。

    一个更好的主意是“猜测”我想要插入的记录的 ID,用select max(id)+1 from mytable;(或类似的东西),生成short_code,并插入记录。在这里,我有一个 SELECT 和一个 INSERT,实际上要好得多。

    我的问题是:
  • 这个问题有更聪明的解决方案吗?
  • 如果没有,我使用解决方案 2(猜测下一个 id),我如何确保在我执行 select max(id)+1 from mytable; 、生成短代码并插入一条记录的时候,没有人会插入另一条记录,所以 max(id)=1 不会“同时改变?

  • 注意!
  • 我无法在 mysql 程序中生成短代码。
  • 必须根据 id 生成短代码。
  • 最佳答案

    Auto-inc 值在插入发生时生成,使用取决于配置的锁定技术(以避免生成两个相同的值),您无法猜测它。在事务环境中,许多事务可能需要一个新的 id,但它们可能会或可能不会提交,因此在查询时,该值是保留的,但仍不使用。

    如果您想“猜测”正确的值,则必须锁定整个表以进行写入,以避免另一个线程插入记录并破坏您的猜测。如果您在 table 上没有很多写入,这将起作用,例如每秒插入几十次。

    如果这个表有很多更新并且写锁不是一个选项,你可以使用另一个表来生成值(它将只有 id 字段),而不是插入/更新,你将有插入/插入,假设这两个操作将尽可能快。

    关于php - InnoDB - 表列值依赖于主键值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14029646/

    10-14 12:53
    查看更多