使用单个查询插入两个表

时间:2011-10-09 08:52:41

标签: php mysql sql database zend-framework

我正在使用zend框架开发一个Web应用程序,问题在于结合2个sql查询以提高效率。我的表结构是这样的

>table message
id(int auto incr)
body(varchar)
time(datetime)

>table message_map
id(int auto incr)
message_id(forgain key from message table's id column)
sender(int ) comment 'user id of sender'
receiver(int) comment 'user id of receiver'

为了使代码正常工作,我首先将消息体和时间插入消息表,然后使用最后插入的id,我将消息发送者和接收者插入到message_map表中。现在我想要做的是在单个查询中执行此任务,因为使用一个查询将更有效。有没有办法这样做。

5 个答案:

答案 0 :(得分:1)

不,没有。您可以一次只插入一个表。

但我无法想象您需要插入如此多的消息,以至于性能确实成为一个问题。即使使用这些单独的语句,任何数据库都可以轻松地每分钟插入数千条记录。

批量插入
当然,在相同的表中插入多个记录时,这是另一回事。这在MySQL中确实是可能的,它将使您的查询更快。但是,如果您需要从所有这些记录中插入insert_id,它会给您带来麻烦。

mysql_insert_id()返回插入最后一个insert语句的第一个id(如果它是批量插入)。因此,您可以查询所有> =该ID的ID。它应该为您提供刚刚插入的所有记录,但结果可能包含其他人在您的插入和以下查询之间插入的ID。

答案 1 :(得分:0)

如果仅用于这两个表。为什么不创建一个包含所有这些列的单个表作为

>table message
id(int auto incr)
body(varchar)
sender(int ) comment 'user id of sender'
receiver(int) comment 'user id of receiver'
time(datetime)

那就像你想要的那样。

答案 2 :(得分:0)

我同意GolezTrol或其他如果您希望为查询优化性能,也许您可​​以选择使用存储过程

答案 3 :(得分:0)

确实将这两个插入物组合是不可能的。虽然您在获取查询中使用JOIN,但您无法组合插入查询。如果你真的担心性能,不管怎么说还没有把这两张表连在一起?到目前为止,我可以看到将它们分开是没有意义的;关于这个消息。 如前所述,顺便说一下,执行第二个插入查询并不是一个服务器负载。

答案 4 :(得分:0)

正如其他人指出的那样,你不能真正更新多个表。并且,除非您在短时间内插入数千条消息,否则您不应该真的担心性能。

现在,有一件事你可以担心。想象一下,您首先插入邮件正文,然后尝试插入接收方/发件人ID。假设第一次成功,而第二次(无论出于何种原因)失败。这会破坏你的数据。为避免这种情况,您可以使用交易,例如

mysql_query("START TRANSACTION", $connection);
//your code
mysql_query("COMMIT", $connection);

这将确保两个插入都进入数据库,或者两者都不进入。如果您使用的是PDO,请查看http://www.php.net/manual/en/pdo.begintransaction.php示例。