Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php InnoDB-依赖于主键值的表列值_Php_Mysql - Fatal编程技术网

Php InnoDB-依赖于主键值的表列值

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生成短代码,并使用新的短代码更新记录 这是可行的,但这真的很慢。我必须做一个插入和更新,这是非常耗时的 更好的办法是“猜测”我要插入的记录将具

我有一个InooDB表:

  • id-主键,自动递增
  • 短_代码-varchar(6),唯一
  • 其他一些专栏
short\u code
总是基于
id
在php中生成。 问题是我无法在插入记录之前生成
short\u code
,因为我不知道
id

我尝试了以下方法:

  • 插入带有空短\u代码的记录
  • 使用
    mysqli\u insert\u id
    或pdo获取插入行的id
  • 根据id生成短代码,并使用新的短代码更新记录
  • 这是可行的,但这真的很慢。我必须做一个插入和更新,这是非常耗时的

    更好的办法是“猜测”我要插入的记录将具有的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 ;