MySQL current_insert_id()?(除 last_insert_id())

MySQL current_insert_id()? (Not last_insert_id())

提问人:Eli 提问时间:5/17/2009 最后编辑:Eli 更新时间:5/17/2009 访问量:3617

问:

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

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

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

谢谢!

mysql 自动增量 insert-id

评论

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

答:

11赞 Bill Karwin 5/17/2009 #1

不,MySQL中没有函数可以为您提供.current_insert_id()

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

我能想到另外两种选择:

  • 在 INSERT 之前,使用除 .例如,请参阅 UUID() 函数。AUTO_INCREMENT

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

2赞 da5id 5/17/2009 #2

据我所知,在一个查询中,MySQL中没有办法做到这一点,但是您可以在选择的服务器端脚本语言中执行以下操作:

<?php

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

?>

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

编辑:我还找到了这个答案,可能会有所帮助。

评论

1赞 Bill Karwin 5/18/2009
这容易受到竞争条件的影响。
0赞 Jason 5/17/2009 #3

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

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

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

评论

0赞 da5id 5/17/2009
Eli 想要的是要插入的 id,而不是刚刚插入的 id。
0赞 Jason 5/17/2009
嗯。。。SELECT whatever, (SELECT id+1 FROM table ORDER BY id DESC LIMIT 1) AS newid .... ?我不知道这是否真的有效
1赞 Bill Karwin 5/18/2009
FWIW,查询顶部 id+1 容易受到争用条件的影响。如果您有多个并发客户端,请不要使用它。
1赞 great_llama 5/17/2009 #4

您可以从 中查询下一个要使用的值。表,那里的列。(您可能正在为争用条件设置自己?information_schemaTABLESAUTO_INCREMENT

评论

1赞 Bill Karwin 5/18/2009
是的,这容易受到竞争条件的影响。