【问题标题】:How to Duplicate Records in the same MySQL Table Using the Inserted IDs如何使用插入的 ID 在同一个 MySQL 表中复制记录
【发布时间】: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,而不是手动构建查询。它们由PDOMySQLi 提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your dataEscaping is not enough!
  • quote_ref_id?嗯?
  • @Dharman,我已经在使用这些了 - $refNum = mysqli_real_escape_string($connect, $_POST['refNum']); $rev = mysqli_real_escape_string($connect, $_POST['rev']);

标签: mysql duplicates last-insert-id


【解决方案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);

    }

【讨论】:

    猜你喜欢
    • 2010-10-18
    • 2019-07-10
    • 2016-12-26
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    相关资源
    最近更新 更多