【问题标题】:Updating three category tables and setting category mapping with MySQL in one Query/Transaction在一个查询/事务中更新三个类别表并设置与 MySQL 的类别映射
【发布时间】:2013-01-30 12:34:06
【问题描述】:

我有三张桌子;

masterCat
category
subCat

猫大师只有两列idname

后面的表有三列,idnamemapsTo

很明显,category 表中的mapsTo 列表示该类别属于哪个masterCat,从而创建了一个分层的类别结构

我正在尝试编写一个脚本,使用户能够更新和修改他们的类别,包括添加新的类别。

所以,如果创建了一个新结构:

newMasterCat > newCategory > newSubCategory

在没有那么多代码行的情况下,如何在MySQL中编写这个,这是它需要做的:

  1. 在每个表中创建新行(3 个插入作为一个事务, 没问题)
  2. 回看那些行,找出分配给masterCatcategory 表修正的ID。
  3. 使用在其父表中创建的记录的 ID 更新 categorysubCat 中的新行

我可以分三个阶段完成,但有更快的方法吗?

(在 VB.net 中使用 MySQL 数据库和 MySQL 驱动程序)

【问题讨论】:

  • ID 字段是否自动递增?如果是这样,我认为您需要分三步完成。
  • 是的,真的,没有 MySQL 魔法我一击就没有遇到过?!

标签: mysql vb.net sql-update insert-update


【解决方案1】:

您可以使用LAST_INSERT_ID() 函数来完成此操作:http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

此函数的结果范围为当前连接,不会受到其他并发插入的影响。所以你的插入看起来像:

INSERT INTO masterCat (name) VALUES ('masterCat1');

INSERT INTO category (name, mapsTo) VALUES ('Cat1', LAST_INSERT_ID());

最后你可以用同样的方式第三次链接它:

INSERT INTO subCat (name, mapsTo) VALUES ('SubCat1', LAST_INSERT_ID());

有人可以评论如何在 VB.NET 中执行这些语句,但您可能必须创建一个存储过程才能在单个调用中执行单独的语句 - 即您可能无法只需将它们链接到 ExecuteNonQuery() 之类的调用即可。

顺便说一句,很多人花很多时间担心防止多个数据库往返,而这不是他们应该关注的瓶颈。

【讨论】:

  • 这看起来很有用,谢谢。感谢您的观点,即这不会真正造成瓶颈,只是一直在寻求简化代码。阅读该链接,无需指定我们想要LAST_INSERT_ID 来自哪个表?这很聪明! :)
  • 它将拉取当前连接期间创建的最后一个id。太棒了,但我还假设我必须在第一次使用它时指定表格,并且当我看不到在哪里执行它时必须重新阅读:)
猜你喜欢
  • 2021-11-30
  • 1970-01-01
  • 2012-07-10
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多