[英]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.