INSERT INTO..SELECT并存储结果

时间:2017-09-21 09:38:39

标签: sql sql-insert

我想知道是否可以使用 INSERT INTO ... SELECT 插入来存储和绑定select查询的结果。

工作INSERT INTO..SELECT(不存储结果):

$query = "INSERT INTO reportmessage (header, sentdate, senttime, ip)
          VALUES ((SELECT header
                   FROM conversation 
                   WHERE id = ?), ?, ?, ?)";

          $stmt = $dbconn->prepare($query);
          $stmt->bind_param('ssss', $convid, $date, $time, $ip);
          if ($stmt->execute() == false) {
            $flag = false;
          }
          $stmt->close();

如果可能,我想要完成的工作(不工作,在布尔错误上抛出调用成员函数bind_param()):

$query = "INSERT INTO reportmessage (header, sentdate, senttime, ip)
          VALUES ((SELECT c.header, c.useroneFK, c.usertwoFK
                   FROM conversation c
                   WHERE c.id = ?), ?, ?, ?)";

          $stmt = $dbconn->prepare($query);
          $stmt->bind_param('ssss', $convid, $date, $time, $ip);
          if ($stmt->execute() == false) {
            $flag = false;
          }
          $stmt->bind_result($header, $useroneFK, $usertwoFK);
          $stmt->fetch();
          $stmt->close();

1 个答案:

答案 0 :(得分:0)

因此,希望使用相同的SELECT来插入数据并在PHP中获取结果,以避免两次查询相同的数据。我担心你不能那样做因为:

  • 您正在执行INSERT操作,INSERT操作通常不返回结果集,只返回受影响的行数。您使用SELECT获取数据不会改变它,只是INSERT操作的另一种变体。

  • 此外,您还希望返回INSERT所需的值。即使您的RDBMS中有一种方法可以返回插入的数据,您只需添加插入操作不需要的任意值。

您可以通过以下几种方式获取数据:

  1. 如果您在示例中放入的查询是真实查询,则只需执行另一个SELECT,如果您在id上有索引,则第二个查询的额外工作几乎可以忽略不计

  2. 如果真实查询是一个非常复杂的查询,其中有很多行需要花费很长时间才能执行,您可以:

    • 将结果存储在评论中建议的时态表中,并将其用于获取INSERTSELECT的数据,以便返回结果。

    • 或者如果插入总是一行,只需执行SELECT,然后使用INSERT .. VALUES(...)中的数据从PHP构造SELECT(你可以这样做)对于更多的一行,但它会更麻烦)。