繁体   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