> 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个操作将尽可能快.