直接在MySQL语句中生成MD5 idHash

时间:2011-05-12 12:03:32

标签: mysql select insert md5

在我的表中,我有一个自动递增的userID。在同一行我有一个idHash。是否可以直接使用相同的INSERT语句从中生成idHash(只是MD5和),这样我就不必选择id,然后再次更新idHash?

问题是:在MySQL生成(自动递增)之前我不知道用户ID。

由于 弗兰克

PS:我正在使用PHP。 PPS:这个问题是关于单一插入的。我知道我可以使用PHP或其他语言手动选择数据然后更新它。

5 个答案:

答案 0 :(得分:1)

我不相信你可以在一个INSERT声明中做到这一点。

你可能可以做的是使用INSERT触发器,它既可以确定新ID,也可以哈希,然后然后更新记录。

答案 1 :(得分:0)

PHP代码段

<?
$tablename      = "tablename";
$next_increment     = 0;
$qShowStatus        = "SHOW TABLE STATUS LIKE '$tablename'";
$qShowStatusResult  = mysql_query($qShowStatus) or die ( "Query failed: " . mysql_error() . "<br/>" . $qShowStatus );

$row = mysql_fetch_assoc($qShowStatusResult);
$next_increment = $row['Auto_increment'];

echo "next increment number: [$next_increment]";
?>

这将为您提供下一次自动增量,然后您可以在插入中使用它。

注意:这并不完美(你的方法不完美,因为你实际上有2个主键)

来自:http://blog.jamiedoris.com/geek/560/

答案 2 :(得分:0)

我可以推荐的一个解决方案是使用最后一个插入ID而不是重新查询表。这是一个简化的例子:

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$query = "INSERT INTO users VALUES (....)";
$mysqli->query($query);

$newUserID = $mysqli->insert_id;

$query = "UPDATE users SET idHash = MD5(userID) WHERE userID = $newUserID";
$mysqli->query($query);

/* close connection */
$mysqli->close();
?>

答案 3 :(得分:0)

如果您使用的是auto_increment,则AFAIK在同一查询中没有“安全”方式。

但是,如果您的表中永远不会删除行,您可以使用这个小技巧:

insert into mytable (col1, col2, col3, idhash) 
values ('', '', '', md5(select max(id) from mytable))

我不明白为什么你需要哈希id,为什么不直接使用id

答案 4 :(得分:0)

这似乎对我有用:

CREATE TABLE tbl (id INT PRIMARY KEY AUTO_INCREMENT, idHash TEXT);
INSERT INTO tbl (idHash) VALUES (MD5(LAST_INSERT_ID() + 1));
SELECT *, MD5(id) FROM tbl;

注意这只适用于单行插入,因为LAST_INSERT_ID返回插入的第一行的插入ID。

对auto_increment值执行MD5(column_name)不起作用,因为尚未生成该值,因此它实际上是在调用MD5(0)