【问题标题】:Insert into multiple tables in one query在一个查询中插入多个表
【发布时间】:2011-04-21 02:10:36
【问题描述】:

假设我有两个表,namesphones, 我想在一个查询中将来自某些输入的数据插入到表中。怎么办?

【问题讨论】:

  • 我猜所有数据库的答案都是“你不能”,但以防万一,你使用的是什么数据库?
  • mysql,最新版本(我看到一些解决方案使用“输出”来完成这项工作,但我更喜欢避免到处走动......)

标签: mysql sql sql-insert multiple-tables


【解决方案1】:

你不能。但是,您可以使用 事务 并将它们都包含在一个事务中。

START TRANSACTION;
INSERT INTO table1 VALUES ('1','2','3');
INSERT INTO table2 VALUES ('bob','smith');
COMMIT;

http://dev.mysql.com/doc/refman/5.1/en/commit.html

【讨论】:

  • 干杯 Joshua,这对我帮助很大。虽然在 MySql 中我认为这是 START 而不是 BEGIN。
  • 交易的目的是什么?我收集到,如果其中一个查询出现问题,那么所有查询都将回滚。是这样吗?还是在性能方面也有所提升?
  • @Clox:这部分是交易的目的。另一个目的是数据库将在事务之前、期间和之后处于已知的稳定状态。这意味着并发查询永远不会看到部分提交的数据。
【解决方案2】:

MySQL 不支持在单个 INSERT statement 中插入多表。奇怪的是,Oracle 是我所知道的唯一一个这样做的...

INSERT INTO NAMES VALUES(...)
INSERT INTO PHONES VALUES(...)

【讨论】:

  • Joshua Smith 的回答比这个好。
【解决方案3】:

我遇到了同样的问题。我用 for 循环解决它。

例子:

如果我想写入 2 个相同表,使用循环

for x = 0 to 1

 if x = 0 then TableToWrite = "Table1"
 if x = 1 then TableToWrite = "Table2"
  Sql = "INSERT INTO " & TableToWrite & " VALUES ('1','2','3')"
NEXT

要么

ArrTable = ("Table1", "Table2")

for xArrTable = 0 to Ubound(ArrTable)
 Sql = "INSERT INTO " & ArrTable(xArrTable) & " VALUES ('1','2','3')"
NEXT

如果您有一个小查询,我不知道这是否是最佳解决方案,但如果您的查询非常大并且它位于带有 if/else/case 条件的动态脚本中,这是一个很好的解决方案。

【讨论】:

  • 当您必须为每个表插入相同的值和/或相同数量的值时很有用。
【解决方案4】:

老问题,但万一有人觉得它有用......在 Posgresql、MariaDB 和可能的 MySQL 8+ 中,您可能会在不使用 WITH 语句的事务的情况下实现相同的目标。

WITH names_inserted AS (
    INSERT INTO names ('John Doe') RETURNING *
), phones_inserted AS (
    INSERT INTO phones (id_name, phone) (
        SELECT names_inserted.id, '123-123-123' as phone
    ) RETURNING *
) SELECT * FROM names_inserted 
        LEFT JOIN phones_inserted 
            ON 
            phones_inserted.id_name=names_inserted.id

在这种情况下,与事务相比,这种技术没有太多优势,但作为一种选择......或者如果您的系统由于某种原因不支持事务......

附:我知道这是一个 Postgresql 示例,但看起来 MariaDB 完全支持这种查询。在 MySQL 中,我想您可能只使用 LAST_INSERT_ID() 而不是 RETURNING * 和一些小的调整。

【讨论】:

    【解决方案5】:

    我的方法很简单...一次处理一个查询, 程序化编程

    工作完美

    //insert data
    $insertQuery = "INSERT INTO drivers (fname, sname) VALUES ('$fname','$sname')";
    //save using msqli_query
    $save = mysqli_query($conn, $insertQuery);
    //check if saved successfully
    if (isset($save)){
        //save second mysqli_query
        $insertQuery2 = "INSERT INTO users  (username, email, password) VALUES ('$username', '$email','$password')";
        $save2 = mysqli_query($conn, $insertQuery2);
    
        //check if second save is successfully
        if (isset($save2)){
            //save third mysqli_query
            $insertQuery3 = "INSERT INTO vehicles (v_reg, v_make, v_capacity) VALUES('$v_reg','$v_make','$v_capacity')";
            $save3 = mysqli_query($conn, $insertQuery3);
    
            //redirect if all insert queries are successful.
            header("location:login.php");
        }
    }else{
        echo "Oopsy! An Error Occured.";
    }
    
    

    【讨论】:

      【解决方案6】:

      必须使用 mysqli_multi_query() 函数执行多个 SQL 语句。

      示例(MySQLi 面向对象):

          <?php
      $servername = "localhost";
      $username = "username";
      $password = "password";
      $dbname = "myDB";
      
      // Create connection
      $conn = new mysqli($servername, $username, $password, $dbname);
      // Check connection
      if ($conn->connect_error) {
          die("Connection failed: " . $conn->connect_error);
      } 
      
      $sql = "INSERT INTO names (firstname, lastname)
      VALUES ('inpute value here', 'inpute value here');";
      $sql .= "INSERT INTO phones (landphone, mobile)
      VALUES ('inpute value here', 'inpute value here');";
      
      if ($conn->multi_query($sql) === TRUE) {
          echo "New records created successfully";
      } else {
          echo "Error: " . $sql . "<br>" . $conn->error;
      }
      
      $conn->close();
      ?>
      

      【讨论】:

      • 这不是一个单一的查询。您只是同时向服务器发送多个查询。还有2个插入
      猜你喜欢
      • 2013-11-15
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多