InnoDB - 表列值取决于主键值

时间:2012-12-25 10:06:23

标签: php mysql

我有一个InooDB表:

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

short_code始终在基于id的php中生成。 问题是我在插入记录之前无法生成short_code,因为我不知道id

我尝试了以下内容:

  1. 插入空short_code
  2. 的记录
  3. 使用mysqli_insert_id或pdo获取插入行的ID,无论
  4. 根据id生成短代码,并使用新的short_code
  5. 更新记录

    这很有效,但这确实很慢。我必须进行插入和更新,这很费时间。

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

    我的问题是:

    1. 这个问题是否有更智能的解决方案?
    2. 如果不是,我选择解决方案2(猜测下一个ID),我怎样才能确保在我select max(id)+1 from mytable;生成短代码并插入记录时,没有人会插入另一个记录,所以max(id)=1在此期间不会改变?
    3. 注意!

      • 我无法在mysql过程中生成短代码。
      • 必须根据ID生成短代码。

3 个答案:

答案 0 :(得分:3)

使用可在插入时生成代码的数据库触发器。

示例(不知道您生成short_code的规则):

delimiter $$
create trigger code_gen after insert on your_table
for each row
begin
   SET NEW.short_code = NEW.id + 1;
end
$$
delimiter ;

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

结帐以下提到的网址(thinkwan的回答)
Most efficient way to get table row count
这样您就可以获得自动增量值。在您的情况下,您可以获取id,因为id是自动增量。这样,您的第一个问题就会得到解决。
然后您只需要使用id生成short_code并插入记录。