如何使用插入的 ID 在同一个 MySQL 表中复制记录
Posted
技术标签:
【中文标题】如何使用插入的 ID 在同一个 MySQL 表中复制记录【英文标题】:How to Duplicate Records in the same MySQL Table Using the Inserted IDs 【发布时间】:2019-12-08 10:47:56 【问题描述】:我有 2 张桌子。第一个表是tbl_items
,第二个表是tbl_items_extras
。
我将我的项目插入tbl_items
,如果这个项目有一个/多个附加项,它们将被插入到tbl_items_extras
表中tbl_items.id=tbl_items_extras.tbl_items_id
。
下面是我的两张表的截图。
我能够使用以下查询完美地复制 tbl_items
的记录;
INSERT INTO `tbl_items` (`items_ref_id`, `rev`, `die_number`, `product_type_id`, `parts_id`, `complexity_id`)
SELECT
q.`items_ref_id`,
q.`rev`+1,
q.`die_number`,
q.`product_type_id`,
q.`parts_id`,
q.`complexity_id`
FROM `tbl_items` q WHERE `items_ref_id`='$refNum' AND `rev`='$maxRev'
但是当我使用以下查询复制 tbl_items_extras
记录时;
INSERT INTO `tbl_items_extras` (`tbl_items_id`, `extras_conditions_id`, `percentage`, `quantity`, `total_percentage`)
SELECT
q.`tbl_items_id`,
q.`extras_conditions_id`,
q.`percentage`,
q.`quantity`,
q.`total_percentage`
FROM `tbl_items_extras` q WHERE `tbl_items_id` IN (SELECT `id` FROM `tbl_items` WHERE `items_ref_id`='$refNum' AND `rev`='$rev')
在这个查询中,我没有得到我真正需要的东西。请参阅下面的屏幕截图。
我需要复制tbl_items_extras
中的选定记录,其中tbl_items_id
必须是tbl_items
中重复记录的SQL_INSERTED_ID
。
结果应如以下屏幕截图所示。
如您所见,tbl_items.id
在tbl_items_extras.tbl_items_id
中被相应地使用。
我知道我可以使用LAST_INSERT_ID
,但这仅适用于单个记录。
【问题讨论】:
您应该使用参数而不是直接将 php 变量放入查询中。 @Dharman,谢谢。但是参数是什么意思? 您应该使用参数化的prepared statements,而不是手动构建查询。它们由PDO 或mysqli 提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your data。 Escaping is not enough! quote_ref_id?嗯? @Dharman,我已经在使用这些了 -$refNum = mysqli_real_escape_string($connect, $_POST['refNum']); $rev = mysqli_real_escape_string($connect, $_POST['rev']);
【参考方案1】:
我找到了我的问题的答案。
我将我的 DUPLICATE QUERY 放在 WHILE LOOP
中,在那里我获取了每一行的 id
。
当tbl_items
复制记录时,它将使用获取的id
复制tbl_items_extras
,并将$inserted_tbl_items_id
插入tbl_items_extras
.tbl_items_id
。
$stmt = $connect->prepare("SELECT * FROM `tbl_items` WHERE `items_ref_id`= ? AND `rev`= ?");
$stmt->bind_param("ii", $refNum, $maxRev);
$stmt->execute();
$result = $stmt->get_result();
// duplicate tbl_items
if($result->num_rows === 0) exit('No rows');
while($row = $result->fetch_assoc())
$id = $row['id'];
// I put my tbl_items DUPLICATE QUERY (same as the above)
$inserted_tbl_items_id = $connect->insert_id; // get inserted id
// and my tbl_items_extras DUPLICATE QUERY
$sql = "INSERT INTO `tbl_items_extras` (`tbl_items_id`, `extras_conditions_id`, `percentage`, `quantity`, `total_percentage`)
SELECT
'$inserted_tbl_items_id',
q.`extras_conditions_id`,
q.`percentage`,
q.`quantity`,
q.`total_percentage`
FROM `tbl_items_extras` q WHERE `tbl_items_id` IN (SELECT `id` FROM `tbl_items` WHERE `id`='$id')";
$connect->query($sql);
【讨论】:
以上是关于如何使用插入的 ID 在同一个 MySQL 表中复制记录的主要内容,如果未能解决你的问题,请参考以下文章
Rails 3 - 如何从 mysql 表中查找最后插入的 ID
如何执行存储在 MySQL 中的将 ID 从一个表插入到另一个表的过程?