簡體   English   中英

在一個查詢中插入多個表

[英]Insert into multiple tables in one query

假設我有兩個表, namesphones ,並且我想在一個查詢中將某些輸入中的數據插入到表中。 怎么做到呢?

你不能。 但是,您可以使用事務並將它們都包含在一個事務中。

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

MySQL 不支持在單個INSERT 語句中插入多表。 奇怪的是,Oracle 是我所知道的唯一一個這樣做的......

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

我有同樣的問題。 我用 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 條件的動態腳本中,這是一個很好的解決方案。

老問題,但萬一有人發現它有用......在 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

在這種情況下,與事務相比,這種技術沒有太多優勢,但作為一種選擇……或者如果您的系統由於某種原因不支持事務……

PS 我知道這是一個 Postgresql 示例,但看起來 MariaDB 完全支持這種查詢。 在 MySQL 中,我想你可能只使用 LAST_INSERT_ID() 而不是 RETURNING * 和一些小的調整。

必須使用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();
?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM