3

我有一个 InooDB 表:

  • id - 主键,自动递增
  • short_code - varchar(6),唯一
  • 其他一些列

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

我尝试了以下方法:

  1. 插入一条带有空 short_code 的记录
  2. mysqli_insert_id使用或 pdo获取插入行的 id
  3. 根据 id 生成短代码,并使用新的 short_code 更新记录

这行得通,但这真的很慢。我必须进行插入和更新,这很耗时。

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

我的问题是:

  1. 这个问题有更聪明的解决方案吗?
  2. 如果不是,我使用解决方案 2(猜测下一个 id),我如何确保在我执行select max(id)+1 from mytable;、生成短代码和插入记录时,没有人会插入另一条记录,所以max(id)=1不会更改与此同时?

笔记!

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

3 回答 3

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 ;
于 2012-12-25T10:08:22.447 回答
2

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

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

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

于 2012-12-25T10:26:21.323 回答
1

结帐下面提到的 URL(thinkswan 的答案)
获取表格行数的最有效方法
这样您可以获得自动增量值。在您的情况下,您可以获得 id,因为 id 是自动递增的。这样,您的第一个问题将得到解决。
然后你所要做的就是使用 id 来生成 short_code 并插入一条记录。

于 2012-12-25T10:17:36.280 回答