【问题标题】:Duplicate a record in MySQL在 MySQL 中复制一条记录
【发布时间】:2009-10-27 18:12:35
【问题描述】:

我有一个表,我想复制表中的特定行。我知道这不是最好的处理方式,但我们正在寻找一种快速的解决方案。

这比我最初想象的要难,我需要做的就是将整条记录复制到 MySql 的自动增量表中的新记录中,而无需指定每个字段。这是因为该表将来可能会更改并且可能会破坏重复。我将从 PHP 中复制 MySQL 记录。

这是一个问题,因为在 'SELECT *' 查询中,MySql 将尝试复制正在复制的记录的 ID,这会产生重复 ID 错误。

这会阻止: INSERT INTO customer SELECT * FROM customer WHERE customerid=9181。它还屏蔽了INSERT INTO customer (Field1, Field2, ...) SELECT Field1, Field2, ..... FROM customer WHERE customerid=9181.

有没有办法通过 PHP 或 MySQL 做到这一点?

【问题讨论】:

    标签: php sql mysql


    【解决方案1】:

    我终于找到了这段代码。我相信它会在未来帮助人们。就是这样。

    function DuplicateMySQLRecord ($table, $id_field, $id) {
      // load the original record into an array
      $result = mysql_query("SELECT * FROM {$table} WHERE {$id_field}={$id}");
      $original_record = mysql_fetch_assoc($result);
    
      // insert the new record and get the new auto_increment id
      mysql_query("INSERT INTO {$table} (`{$id_field}`) VALUES (NULL)");
      $newid = mysql_insert_id();
    
      // generate the query to update the new record with the previous values
      $query = "UPDATE {$table} SET ";
      foreach ($original_record as $key => $value) {
        if ($key != $id_field) {
            $query .= '`'.$key.'` = "'.str_replace('"','\"',$value).'", ';
        }
      }
      $query = substr($query,0,strlen($query)-2); # lop off the extra trailing comma
      $query .= " WHERE {$id_field}={$newid}";
      mysql_query($query);
    
      // return the new id
      return $newid;
    }
    

    这里是文章链接http://www.epigroove.com/posts/79/how_to_duplicate_a_record_in_mysql_using_php

    【讨论】:

    • 我尝试使用它,foreach函数出现错误。
    【解决方案2】:

    怎么样

    insert into test.abc select null, val1, val2 from test.abc where val2 = some_condition;
    

    似乎对我有用。替换您的表格、字段和条件。

    null 让数据库为您生成自增 ID。

    【讨论】:

    • 缺点是我必须对 val1、val2 等进行硬编码。有没有办法不进行硬编码?
    • 是的,这就是缺点。我可能会选择以编程方式确定列名并即时构建适当的插入语句,以避免对列进行硬编码。 “SHOW COLUMNS FROM table”将为您提供该信息,并且该调用的结果中有一个“字段”和“键”列。虽然我不是 PHP 开发人员,但我怀疑您可以调用来检索列名,剔除非主键字段并从中构造插入语句。没试过,但怀疑这会奏效。
    【解决方案3】:

    选项:

    1. 避免使用* 通配符,并自行指定所有列。但是您说该表预计将来会发生变化,这对您的情况来说不是一个可行的解决方案。

    2. 自省当前表定义中的列(使用DESCRIBE 或通过查询INFORMATION_SCHEMA.COLUMNS)。使用有关元数据的这些信息来构建查询,省略自动增量主键列。

    3. 执行SELECT * 查询,将该行取回您的应用程序,然后从中删除自动增量列。然后使用该元组构造一个INSERT 语句。

    简而言之,您需要适应不断变化的元数据。这可能无法在单个查询中完成。

    【讨论】:

      【解决方案4】:

      如何将这些行复制到临时表中,然后再复制回客户表中?我认为这会迫使 mysql 给它一个新的自动增量 ID,尤其是在您发布的第二个版本的查询中。

      【讨论】:

        【解决方案5】:

        到目前为止有两篇文章,这里是第三个选项:在 PHP 中,动态确定表中的字段。或者,您可以制作一个“硬编码”字段的数组列表,手动维护以反映表格。您生成的查询不会使用 *。

        【讨论】:

          【解决方案6】:

          如果您知道表中主键列的名称(我猜您知道是因为它在 where 子句中),我认为您可以这样做:

          编辑 - 我忘了 MySQL 不支持 select...into。这应该可以代替

          create new_table 
          select * 
          from   customer
          where  customerid = 9181 
          
          alter table new_table 
          drop column customerid
          
          insert into customer
          select  null, *
          from    new_table
          
          drop table new_table
          

          【讨论】:

            【解决方案7】:

            有一种简单的方法,可以在同一个表测试中创建重复记录。在我的本地

            1. 从 information_schema.columns 中选择 column_name,data_type 其中 table_name = 'your_table_name' AND column_name != 'id'
            2. 准备 column_name 数组并使用“,”连接以创建如下所示的插入语句
            3. INSERT INTO table2 (column1, column2, column3, ...) SELECT column1, column2, column3, FROM 表 1
            4. 执行查询插入。这将很容易工作

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-02-12
              • 1970-01-01
              • 2023-03-31
              • 2010-10-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多