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