【问题标题】:MySQL current_insert_id()? (Not last_insert_id())MySQL current_insert_id()? (不是 last_insert_id())
【发布时间】:2010-10-26 18:50:08
【问题描述】:

我正在插入一个带有 char 列的行,用于基于(除其他外)该行的自动 ID 的哈希值。

我知道我可以插入它,获取 insert_id,计算哈希值,然后更新它。

有人知道在单个查询中执行此操作的方法吗?您在插入时需要行 insert_id。这是完全不可能的吗,还是有类似 current_insert_id()...

谢谢!

【问题讨论】:

  • 我很好奇,你为什么需要一个带有从 rows 键生成的哈希的列?
  • 在这种情况下,它实际上不是一个哈希,而是一个半可读的公钥,由 base 36 中的行键组成,附加到其他一些东西上。它在表单和其他需要唯一键来标识行但不想公开实际行 id 或显示可预测模式的地方用作公钥。

标签: mysql auto-increment insert-id


【解决方案1】:

不,MySQL 中没有提供current_insert_id() 的函数。

从 MySQL 中的AUTO_INCREMENT 字段获取生成的 ID 值的唯一方法是执行 INSERT,然后调用 last_insert_id()。因此,您可能需要执行单独的 UPDATE 来计算哈希的计划。

我能想到另外两种选择:

  • 在 INSERT 之前使用除AUTO_INCREMENT 之外的其他机制自己生成唯一值。例如,请参阅UUID() 函数。

    SET @id = SELECT UUID();
    INSERT INTO MyTable (id, hash) VALUES (@id, hash(@id...));
    
  • 不要在哈希计算中包含 ID。

【讨论】:

    【解决方案2】:

    据我所知,在 MySQL 中无法在一个查询中执行此操作,但您可以在您选择的服务器端脚本语言中执行类似的操作:

    <?php
    
    $query = mysql_query("SHOW TABLE STATUS LIKE 'MyTable'");
    $row = mysql_fetch_assoc($query);
    $next_id = $row['Auto_increment'];
    
    ?>
    

    ...它为您提供了要合并到 SQL 中的 id。

    编辑:我还发现 this answer 可能会有所帮助。

    【讨论】:

    • 这很容易受到竞争条件的影响。
    【解决方案3】:

    您可以从information_schema.TABLES 表中的AUTO_INCREMENT 列中查询下一个要使用的值。 (您可能正在为比赛条件做准备?)

    【讨论】:

    • 是的,这很容易受到竞争条件的影响。
    【解决方案4】:

    当我做插入时,我会做这样的事情:

    INSERT INTO table (col1,col2) VALUES (data1,data2);SELECT LAST_INSERT_ID()

    然后像获取数据一样运行查询。在 VB.NET 中,语法是(假设您有 MySql.Data.MySqlClient .dll):

    Dim sql As String = "[sql string above]"
    Dim dr As MySqlDataReader = YourRetrieveDataFunction(sql)
    
    dr.Read()
    yourObjectInstance.ID = dr(0)
    dr.Close
    

    从技术上讲,这是两个查询,但对数据库只有一个命中 :)

    【讨论】:

    • Eli 希望插入 about 的 id,而不是刚刚插入的 id。
    • hmm... 选择任何内容,(SELECT id+1 FROM table ORDER BY id DESC LIMIT 1) AS newid .... ?我不知道这是否真的有效
    • FWIW,查询顶部 id+1 容易受到竞争条件的影响。如果您有多个并发客户端,请不要使用它。
    猜你喜欢
    • 2011-04-19
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 2014-07-02
    相关资源
    最近更新 更多