在一个查询中插入多个表

问题描述 投票:0回答:6

假设我有两张桌子,

names
phones
, 我想在一个查询中将某些输入的数据插入到表中。怎么办?

mysql sql sql-insert multiple-tables
6个回答
69
投票

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

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


19
投票

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

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

8
投票

在 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 * 和一些小的调整。


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 条件的动态脚本内,那么这是一个很好的解决方案。


2
投票

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

效果非常完美

//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.";
}


-1
投票

必须使用

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();
?>
© www.soinside.com 2019 - 2024. All rights reserved.