1

我需要在一张表中生成大量行,不幸的是,需要在应用程序端(PHP)生成一列。

所以基本上我需要生成这样的东西:

 id |  encoded_val_based_on_id
-------------------------------
  1 | my_encode_func( 1 )      
-------------------------------
  2 | my_encode_func( 2 )      
-------------------------------
  3 | my_encode_func( 3 )      
-------------------------------
  4 | my_encode_func( 4 )      

我认为,必须有更好的方法,然后生成N查询以获取Nid,然后使用“encoded_val_based_on_id”更新这些记录。

除此之外,我想在“encoded_val_based_on_id”上保留唯一索引,因为我会生成空白行然后填充它们,所以我无法做到这一点。

我可以锁定表,获取最后一个 ID,通过在我的应用程序中递增生成 ID + 生成所有其他内容,插入它们并解锁表。我认为这不是正确的方法,但至少可以在 1 个查询(批量插入)中完成,并且我可以将唯一索引保留在那里。

4

1 回答 1

1

直到您完成插入后,您才知道 id 的值(假设自动递增)。

最好的解决方案是拥有生成该值的函数,作为可以从 SQL 调用的值。然后,您可以在插入时使用触发器来获取 id 并计算值。但是,从您所说的来看,这并不可行。

InnoDB 和 MyISAM 都允许您在 UNIQUE 索引中具有 NULL 值。

我想我会很想插入 X 行,该字段为空白/空。然后检索该字段为空的所有行,获取 id 字段。然后从 id 字段计算值并更新行。

这当然可能意味着多次更新,这是非常可怕的。一个解决方案是使用 INSERT.....ON DUPLICATE KEY UPDATE 来进行更新。当您指定 id 时,您将触发每一行的更新,并且由于您可以在单个插入查询中拥有数千行,这可以非常有效地完成。

于 2013-05-30T13:21:53.200 回答