在我的表中,我有一个自动递增的userID。在同一行我有一个idHash。是否可以直接使用相同的INSERT语句从中生成idHash(只是MD5和),这样我就不必选择id,然后再次更新idHash?
问题是:在MySQL生成(自动递增)之前我不知道用户ID。
由于 弗兰克
PS:我正在使用PHP。 PPS:这个问题是关于单一插入的。我知道我可以使用PHP或其他语言手动选择数据然后更新它。
答案 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个主键)
答案 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)
。