在MySQL中添加时,有一列等于[auto-increment]主键

时间:2012-02-27 21:02:09

标签: php mysql

我希望在添加记录时,列与主键具有相同的值 - 而不是在添加记录后立即更新记录,是否有更好的方法来执行此操作?

我目前正在做的事情:

$db->query("INSERT INTO 'mytable' SET ...");
$db->query("UPDATE 'mytable' SET someColumn=".$db->insert_id." WHERE id=".$db->insert_id);

我想要做的只是运行一个查询而不是两个查询,如果可能的话。

我目前做错了什么?不完全是,我只想这样做,因为学习新的编码方法总是好的。 :)

3 个答案:

答案 0 :(得分:2)

如果someColumn 总是等于id,那么它就是无用的非规范化。我们应该在查询中使用id而不是someColumn

在正确的RDBMS中或者如果您在应用程序端生成主键,您可以使用密钥生成器以相同的值填充idsomeColumn列。我不知道MySQL的AUTO_INCREMENT hack是否提供了类似于线程安全的SQL序列的东西。在任何情况下,您都应该阅读具体的documentation pages,因为没有多少标准知识或经验可以帮助您解决AUTO_INCREMENT brainf 怪癖。

或者,您可以为someColumn(或布尔列)设置一个特殊值,这意味着“只需插入/使用id的值”。

答案 1 :(得分:1)

INSERT INTO ... SET?那是错的。 < - 不,这没错,我很傻。

如果可能的话,我会创建CASCADE foreing key constraint。

答案 2 :(得分:1)

如果你只需要顺序而不一定完全与id列相同,你可以这样做:

INSERT INTO mytable SET foo = (select max(foo) + 1 from mytable)

顺便说一句,这对我来说很危险:

$db->query("UPDATE 'mytable' SET someColumn=".$db->insert_id." WHERE id=".$db->insert_id);

假设您正在使用pdo,请始终使用预准备语句/绑定参数将值绑定到查询 - 从不插入字符串。 E.g;

$stmt = $db->prepare("UPDATE 'mytable' SET someColumn = :someColumn WHERE id = :id");
$stmt->execute(array(":someColumn" => $db->insert_id, ":id" => $db->insert_id));