php – InnoDB – 表列值取决于主键值

我有一个InooDB表:

> id – 主键,自动增量
> short_code – varchar(6),唯一
>其他一些专栏

short_code总是在基于id的PHP生成.
问题是我在插入记录之前无法生成short_code,因为我不知道id.

我尝试了以下方法

>插入带有空short_code的记录
>使用mysqli_insert_id或pdo获取插入行的id
>根据id生成代码,并使用新的short_code更新记录

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

一个更好的想法是“猜测”我要插入的记录所具有的ID
从mytable中选择max(id)1; (或类似的东西),生成short_code,并插入记录.这里我有一个SELECT和一个INSERT实际上要好得多.

我的问题是:

>这个问题有更聪明的解决方案吗?
>如果没有,并且我使用解决方案2(猜测下一个id),我怎样才能确保在我从mytable中选择max(id)1时,生成代码并插入记录,没有人会插入另一条记录,所以max(id)= 1在此期间不会改变?

注意!

>我无法在MysqL过程中生成代码.
>必须根据id生成代码.

解决方法:

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

如果你想“猜测”正确的值,你必须锁定整个表进行写入,以避免另一个线程插入记录并打破你的猜测.如果您在桌面上没有大量写入,这将起作用,例如:每秒几十次插入.

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

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...