我希望在添加记录时,列与主键具有相同的值 - 而不是在添加记录后立即更新记录,是否有更好的方法来执行此操作?
我目前正在做的事情:
$db->query("INSERT INTO 'mytable' SET ...");
$db->query("UPDATE 'mytable' SET someColumn=".$db->insert_id." WHERE id=".$db->insert_id);
我想要做的只是运行一个查询而不是两个查询,如果可能的话。
我目前做错了什么?不完全是,我只想这样做,因为学习新的编码方法总是好的。 :)
答案 0 :(得分:2)
如果someColumn
总是等于id
,那么它就是无用的非规范化。我们应该在查询中使用id
而不是someColumn
。
在正确的RDBMS中或者如果您在应用程序端生成主键,您可以使用密钥生成器以相同的值填充id
和someColumn
列。我不知道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));