如何使用插入的 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.idtbl_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 从一个表插入到另一个表的过程?

如何在 MySQL 上使用 Hibernate 批量插入递增的 ID?

如何在没有'id'列的MySql中获取最后插入的记录?

将两个数组插入到一个mysql表中

php如何将逗号分隔的多个json格式的字符串作为一个值插入到mysql表中? [复制]