【问题标题】:MySQL - can I use the gonna-be insert_id in the actual insert query itself?MySQL - 我可以在实际插入查询本身中使用将要插入的 insert_id 吗?
【发布时间】:2012-08-28 12:08:52
【问题描述】:

我刚遇到一种情况,我需要复制唯一的 (自动递增)另一列中每个新行的 id。所以我是 想知道,而不是用老式的方式来做:

  1. 插入行
  2. 获取 insert_id
  3. 使用 insert_id 更新行

我可以告诉 MySQL 使用与新 id 相同的值吗 要设置为另一列的值?

类似这样的事情:

INSERT INTO my_table(unique_column, id_duplicate) 
VALUES('value', GET_UNIQUE_ID_OF_THIS() )

【问题讨论】:

  • 你永远无法知道下一个 ID 会是什么,除非你锁定它......通过插入一条新记录,因此你的“老式方式”。
  • 为什么要在另一列中复制自动增量列?如果您描述了您想要完成的任务,我们可以帮助您提供最佳实践或不同的解决方案。
  • 我不知道我能不能解释清楚,这有点复杂.. 但基本上有一个数据库,其中存储在一个表 (A) 中的小部件引用不同表中的某些上下文 (乙)。现在我们引入了一种新的小部件类型,它必须引用一组行(在 B 中),而不仅仅是一个。所以我不想让这个组 ID (B) 成为最新最大组 ID 的增量,因为它容易受到互斥问题的影响。但相反,我想使用小部件的唯一 ID(来自 A)作为表 A 中的上下文 ID,从而使用表 B 中的组 ID。这是我最简单的解决方案。
  • 这是什么“互斥问题”?

标签: mysql duplicates unique-id


【解决方案1】:

在单个查询中使用自动增量列无法完成您想要完成的任务。

尝试从另一个方向接近它。假设您的自动增量列是id,而您的另一列称为other_id。您可以将 other_id 列设置为允许 NULL,并简单地将其值设置为 NULL 以进行初始插入。

然后,当您查询该值时,只需执行以下操作:

SELECT id, IFNULL(other_id, id) AS other_id FROM mytable

最终结果是一样的。如果你有反对 NULL 的东西,你也可以使用 0 作为默认值,因为自动增量值从 1 开始。

【讨论】:

  • 哦,这非常好,也许它还会使表格(也许微不足道)更小。非常感谢!
  • 其实,在我使用它之前,让我再问你一个问题。假设一个表的大小足够大,差异会很明显,我宁愿使用我的“老式”方式牺牲表大小还是使用你的查询速度?选择查询比插入查询更常用,因此我之前较长的插入查询不如此选择查询重要。
  • 上述解决方案阻止 MySQL 在 other_id 列上使用索引,因此如果发出多个查询(“老式方式” ) 当您插入新行时。
猜你喜欢
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 2011-10-28
  • 2010-12-11
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多