Php InnoDB-依赖于主键值的表列值
我有一个InooDB表:Php InnoDB-依赖于主键值的表列值,php,mysql,Php,Mysql,我有一个InooDB表: id-主键,自动递增 短_代码-varchar(6),唯一 其他一些专栏 short\u code总是基于id在php中生成。 问题是我无法在插入记录之前生成short\u code,因为我不知道id 我尝试了以下方法: 插入带有空短\u代码的记录 使用mysqli\u insert\u id或pdo获取插入行的id 根据id生成短代码,并使用新的短代码更新记录 这是可行的,但这真的很慢。我必须做一个插入和更新,这是非常耗时的 更好的办法是“猜测”我要插入的记录将具
- id-主键,自动递增
- 短_代码-varchar(6),唯一
- 其他一些专栏
short\u code
总是基于id
在php中生成。
问题是我无法在插入记录之前生成short\u code
,因为我不知道id
我尝试了以下方法:
mysqli\u insert\u id
或pdo获取插入行的id从mytable中选择max(id)+1代码>(或类似内容),生成短代码,然后插入记录。这里我有一个选择和一个插入,这实际上是更好的
我的问题是:
这个问题有没有更聪明的解决方案
如果没有,我使用解决方案2(猜测下一个id),我如何确保在执行时从mytable中选择max(id)+1
,生成短代码并插入一条记录,没有人会插入另一条记录,所以max(id)=1
不会同时更改
注意强>
- 我无法在mysql过程中生成短代码
- 必须根据id生成短代码
使用DB触发器,在插入时生成代码
示例(不知道生成短代码的规则是什么):
签出下面提到的URL(thinkswan的答案)
这样可以得到自动增量值。在您的情况下,可以获取id,因为id是自动递增的。这样,您的第一个问题将得到解决。
然后您所要做的就是使用id生成短代码并插入一条记录。当插入发生时,会生成自动inc值,并使用锁定技术(避免生成两个相同的值),这取决于配置,您无法猜测。在事务性环境中,许多事务可能需要一个新id,但它们可能提交,也可能不提交,因此在查询时,该值是保留的,但仍然没有使用
如果要“猜测”正确的值,必须锁定整个表进行写入,以避免另一个线程插入记录并打破猜测。如果您的表上没有太多写入操作,例如每秒插入几十次,那么这将起作用
如果此表上有很多更新,并且写锁不是一个选项,则可以使用另一个表生成值(它将只有id字段),并且假设这两个操作将尽可能快,您将使用insert/insert代替insert/update。这是一个好主意,但我希望在php端生成简短的代码。这段短代码是一个易于阅读的6字符长字符串(例如:“awexo”、“opeda”、“ikami”等),基于id生成。如果我有其他选择,我不想在mysql中实现此算法。顺便说一句,这是我实现的生成器:您正在根据PK进行更新;它不应该比选择+插入快太多。检查查询是否没有其他问题。你能发布你的基准吗?
delimiter $$
create trigger code_gen after insert on your_table
for each row
begin
SET NEW.short_code = NEW.id + 1;
end
$$
delimiter ;