我有一个 InooDB 表:
short_code
总是基于 id
在 php 中生成。问题是我无法在插入记录之前生成
short_code
,因为我不知道 id
。我尝试了以下方法:
mysqli_insert_id
或 pdo 获取插入行的 ID,无论 这有效,但这真的很慢。我必须进行插入和更新,这很耗时。
一个更好的主意是“猜测”我想要插入的记录的 ID,用
select max(id)+1 from mytable;
(或类似的东西),生成short_code,并插入记录。在这里,我有一个 SELECT 和一个 INSERT,实际上要好得多。我的问题是:
select max(id)+1 from mytable;
、生成短代码并插入一条记录的时候,没有人会插入另一条记录,所以 max(id)=1
不会“同时改变? 注意!
最佳答案
Auto-inc 值在插入发生时生成,使用取决于配置的锁定技术(以避免生成两个相同的值),您无法猜测它。在事务环境中,许多事务可能需要一个新的 id,但它们可能会或可能不会提交,因此在查询时,该值是保留的,但仍不使用。
如果您想“猜测”正确的值,则必须锁定整个表以进行写入,以避免另一个线程插入记录并破坏您的猜测。如果您在 table 上没有很多写入,这将起作用,例如每秒插入几十次。
如果这个表有很多更新并且写锁不是一个选项,你可以使用另一个表来生成值(它将只有 id 字段),而不是插入/更新,你将有插入/插入,假设这两个操作将尽可能快。
关于php - InnoDB - 表列值依赖于主键值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14029646/