簡體   English   中英

根據 PHP-MySQL 中另一個表的字段值在一個表上插入行

[英]Insert rows on one table based on the values of a field of another table in PHP-MySQL

我想詢問如何根據另一個表中的字段值插入n行的解決方案。

考慮下表:

CREATE TABLE Input (
    ID INT AUTO_INCREMENT PRIMARY KEY,
    Name VARCHAR(128),
    Ticket_Piece INT
);

CREATE TABLE Output (
    Ticket_ID INT AUTO_INCREMENT PRIMARY KEY,
    Transaction_ID INT,
    Ticket_Number VARCHAR(23) UNIQUE,
    FOREIGN KEY (Transaction_ID)
        REFERENCES Input (ID)
        ON UPDATE CASCADE
        ON DELETE CASCADE
);

如果Input表中的一行在Ticket_Number列中有n行,則應將n行插入Output表中, Ticket_Number的值從“ ID -1”到“ ID -n ”(例如(4, "D", 5)中的Input應導致將票號為“4-1”到“4-5”的行添加到Output )。 如何使用 PHP 和 MySQL 在基於Ticket_Piece列的一系列數字中生成Output的行?

例如,輸入:

INSERT INTO Input (ID, Name, Ticket_Piece)
  VALUES
(1, 'A', 2),
(2, 'B', 1),
(3, 'C', 3)
;

結果應該是:

票證_ID 交易ID 票號
1 1 1-1
2 1 1-2
3 2 2-1
4 3 3-1
5 3 3-2
6 3 3-3

對於從輸入表中獲取的每一行,使用for循環將多行插入 output 表中。

$res = $pdo->query("SELECT id, ticket_piece FROM Input_Table");
$insert_stmt = $pdo->prepare("INSERT INTO Output_Table (transaction_id, ticket_number) VALUES (:id, :ticket)");
while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
    $pieces = $row['ticket_piece'];
    $id = $row['transaction_id'];
    for ($i = 1; $i <= $pieces; $i++) {
        $insert_stmt->execute([':id' => $id, ':ticket' => "$id-$i"]);
    }
}

如果這來自數據 model 而不是業務規則(並且取決於其他因素),則觸發器可能是一個相當簡單的選項。 觸發器主體可以有一個WHILE或其他循環來迭代票件編號,並且CONCAT將 ID 和件號組合成一個票號,依次插入每個。

DELIMITER ;;
CREATE TRIGGER create_ticket_pieces
  AFTER INSERT ON Input
  FOR EACH ROW
BEGIN
  DECLARE piece INT DEFAULT 1;
  WHILE piece <= NEW.Ticket_Piece DO
    INSERT INTO Output (Transaction_ID, Ticket_Number) Values (NEW.ID, Concat(NEW.ID, '-', piece));
    SET piece := piece + 1;
  END WHILE;
END;;
DELIMITER ;

暫無
暫無

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

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