【问题标题】:knowing next value from auto increment field mysql java从自动增量字段mysql java中知道下一个值
【发布时间】:2012-12-22 22:27:33
【问题描述】:

我想知道自增字段的下一个值 我想测试一下:

select max(contactid) from contact

然后我加 1 但我意识到它会给我一个错误 举个例子 如果我插入一条记录并删除它 所以如果我在字段之后插入会增加两个

我怎样才能做到这一点? 谢谢

【问题讨论】:

  • 如果您的目标是“预测”生成的 id,请不要这样做。这总是迟早会导致麻烦。
  • 没有可靠的方法来预测将分配给当前会话插入的行的下一个 AUTO_INCREMENT 值。您可以获得的最接近的是 LOCK TABLESHOW TABLE STATUS 语句,但即便如此,也不要将您的代码设计为依赖于预测 auto_increment 值,因为即使简单测试,该代码也会被设计“破坏”案例可能会使其看起来有效。

标签: mysql field auto-increment next


【解决方案1】:

你应该像这样使用LAST_INSERT_ID

SELECT LAST_INSERT_ID()

它将返回AUTO_INCREMENT ID 字段的最后一个值。

更多详情:http://goo.gl/RkmR5

【讨论】:

  • 这是对LAST_INSERT_ID() 函数返回值的过于简化的描述。并且该语句的语法无效... LAST_INSERT_ID() 是一个函数,需要括号。此外,无需为contact 表中的每一行返回该值。该函数将返回最新 INSERT 的值,无论是否将行插入到 contact 表中。
  • 谢谢斯宾塞。我写的时候是凌晨 3 点。现在会修复它
【解决方案2】:

这将为您提供 下一个 id 值, 将被插入:

SELECT LAST_INSERT_ID() + 1;

【讨论】:

  • 不,不会。如果您刚刚INSERTed 一行,它将为您提供分配给该行的自动增量值,加一。
  • @jeremycole 你不正确:它返回最后插入的值(如函数名称所示)。来自 mysql 文档:LAST_INSERT_ID()最后一个 INSERT 的 AUTOINCREMENT 列的值。详情请参阅the official mysql documentation
  • 不,这不一定给出将要插入的下一个 id 值……如果会话没有执行生成自动增量值的 INSERT 语句;或者如果语句插入了多行;如果 AUTO_INCREMENT 列不是 MyISAM 表索引中的前导列,或者 auto_increment_increment 变量设置为 1 以外的值,如果另一个会话在表中生成 AUTO_INCREMENT 值......有各种条件该语句将无法可靠地返回要生成的下一个 AUTO_INCREMENT 值,更不用说插入了。
  • @Bohemian 你引用的文字同意我的观点。 LAST_INSERT_ID() 将为您提供最后插入的行的 ID。 + 1(在您的回答中)将添加一个。即 与“将要插入的下一个值”相同;返回的值甚至可能已被另一个会话使用。在任何情况下,这都不是获得“下一个值”的安全方法(提示:没有)。
【解决方案3】:

这个问题有多种解决方案:

1. (首选)停止尝试预测自增值

这是比较典型的情况,基本上是按照设计使用自增。这假设您实际上并不需要插入的自动增量值before。你可以做的是:

DROP TABLE IF EXISTS t;
CREATE TABLE t (id INT UNSIGNED NOT NULL auto_increment, x INT NOT NULL, PRIMARY KEY(id));
INSERT INTO t (x) VALUES (100);
SELECT LAST_INSERT_ID();

SELECT LAST_INSERT_ID() 的调用将返回刚刚为您的INSERT 生成的ID。

2。专门设置一个ID生成表来生成ID

您可以创建一个只有一个自增列的表,如下所示:

DROP TABLE IF EXISTS id_generator;
CREATE TABLE id_generator (id INT UNSIGNED NOT NULL auto_increment, PRIMARY KEY(id));

然后您可以生成一个新的唯一 ID:

INSERT INTO id_generator (id) VALUES (NULL);
SELECT LAST_INSERT_ID();

并使用该 ID 插入您实际使用的表中。只要所有生成的 ID 都来自这个 ID 生成表,就不会有冲突。然而,生成这些 ID 是有成本的,而且自动递增的效率不是很高。

3.使用外部 ID 生成方案

这或多或少类似于解决方案 2,但根本不使用 MySQL 来生成 ID。您可以使用生成字符串的 UUID/GUID 方案之类的东西,也可以使用 Snowflake 之类的东西来生成整数 ID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 2016-03-24
    • 2013-04-10
    • 2011-02-24
    相关资源
    最近更新 更多