2012-02-27 87 views
1

当添加一条记录时,希望列的值与主键相同 - 而不是必须立即更新记录已被添加,有没有更好的方法来做到这一点?当在MySQL中添加一列时,有一列等于[自动增量]主键

目前我在做什么:

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

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

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

+2

你能解释为什么你想要数据被复制吗?你已经拥有数据库中的数据,我不明白你为什么需要它两次。 – SenorAmor 2012-02-27 21:05:35

+0

我想不出任何原因,你会使用它不会导致问题的地方。 – Crashspeeder 2012-02-27 21:08:24

+0

我使用它(重复列)作为输入后的数据排序目的。如果你知道一个更好的方式,没有什么麻烦,我愿意提供建议。 – 2012-02-27 21:11:01

回答

1

INSERT INTO ... SET?这是错误的。 < - 不,这没有错,我是个傻瓜。

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

+0

上周我第一次看到'INSERT INTO ... SET'。这似乎是完全有效的。 – Crashspeeder 2012-02-27 21:07:12

+0

是的,我现在看到了,但对我来说还是很奇怪。 :) – 2012-02-27 21:08:23

+0

我可以试试这个,尽管如果它甚至可能会显得有些杂乱。与此同时,我正在浏览MySQL文档。 – 2012-02-27 21:16:50

2

如果someColumn总是将等于id,这是无用的非规范化。在查询中,应该简单地使用id而不是someColumn

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

或者,您可以为someColumn(或布尔列)指定一个特殊值,意思是“刚插入/使用id的值”。

+0

密钥生成器听起来不太糟糕,我会牢记这一点。谢谢。 – 2012-02-27 21:19:22

+0

也看起来像我可以在我的查询中使用“someColumn = LAST_INSERT_ID()+ 1”,这不应该是可怕的。任何人都反对使用这个? – 2012-02-27 21:29:55

+1

它不会被同步。只有两个并发插入会破坏它。 – aib 2012-02-27 21:47:46

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,请始终使用预准备语句/绑定参数将值绑定到查询 - 绝不能插入字符串。例如。;

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