我有一个InooDB表:
short_code
始终在基于id
的php中生成。
问题是我在插入记录之前无法生成short_code
,因为我不知道id
。
我尝试了以下内容:
mysqli_insert_id
或pdo获取插入行的ID,无论这很有效,但这确实很慢。我必须进行插入和更新,这很费时间。
更好的想法是“猜测”我要插入的记录所具有的ID
select max(id)+1 from mytable;
(或类似的东西),生成short_code,并插入记录。这里我有一个SELECT和一个INSERT实际上要好得多。
我的问题是:
select max(id)+1 from mytable;
生成短代码并插入记录时,没有人会插入另一个记录,所以max(id)=1
在此期间不会改变?注意!
答案 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并插入记录。