【发布时间】:2012-08-14 10:00:00
【问题描述】:
我的 MySQL 表中的第一列包含一个自动增量 ID。我想在向表中插入新行时将此值输入另一列,即我需要读取 ID 列中的值并将其插入下一列。
是否有可能做到这一点,如果可以,怎么做?
【问题讨论】:
标签: mysql insert auto-increment
我的 MySQL 表中的第一列包含一个自动增量 ID。我想在向表中插入新行时将此值输入另一列,即我需要读取 ID 列中的值并将其插入下一列。
是否有可能做到这一点,如果可以,怎么做?
【问题讨论】:
标签: mysql insert auto-increment
这应该有效:
INSERT INTO table(id, same_id, col1)
(
SELECT NULL AS id,
(SELECT AUTO_INCREMENT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA=DATABASE() AND
TABLE_NAME='table') AS same_id,
"value" AS col1
);
编辑:正如Jonathan Swartz 所指出的,它确实受到竞争条件的影响。
要解决此问题,请使用 LAST_INSERT_ID() 获取最后插入的 id 并在新列中更新此值:
INSERT INTO table(id, same_id, col1)
(
SELECT NULL AS id,
NULL AS same_id,
"value" AS col1
);
SELECT LAST_INSERT_ID() INTO @var_id;
UPDATE table
SET same_id = @var_id
WHERE id = @var_id;
【讨论】:
【讨论】:
我确信上述一些答案有效,但我无法弄清楚如何实施它们。然而,我确实使用$pdo->lastInsertId() 成功实现了一个解决方案,即在执行我的 INSERT 查询后,我添加了:
$new_id = $pdo->lastInsertId();
$sth2 = $pdo->prepare("UPDATE `tracks` SET `fav_id`= IF(`fav_id`=0,$new_id,fav_id) WHERE `id`=$new_id");
$sth2->execute();
如果 fav_id 尚未设置,这会将最后插入的行的 fav_id 列设置为与该行的 id 列相同的值。
【讨论】:
如果您在此使用PHP,则可以使用mysqli_insert_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();
}
$mysqli->query("CREATE TABLE myCity LIKE City");
$query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";
$mysqli->query($query);
printf ("New Record has id %d.\n", $mysqli->insert_id);
/* drop table */
$mysqli->query("DROP TABLE myCity");
/* close connection */
$mysqli->close();
?>
mysqli_insert_id() 函数返回由对具有 AUTO_INCREMENT 属性的列的表的查询生成的 ID。如果最后一个查询不是 INSERT 或 UPDATE 语句,或者修改后的表没有具有 AUTO_INCREMENT 属性的列,则此函数将返回零。
【讨论】:
$id = mysqli_insert_id($sql); $sql2="UPDATE tracks SET fav_id='$id' WHERE id='$id'";,但 fav_id 仍然设置为 0。
您也可以使第二列自动递增(使用匹配的 AUTOINCREMENT 初始值),有或没有任何键。
【讨论】: