Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Duplicate a record in MySQL

Tags:

sql

php

mysql

I have a table and I want to duplicate specific rows in the table. I know this is not the best way to do things but we are looking for a quick solution.

Here's something harder than I initially thought, all I need to do is copy an entire record to a new record in an auto-increment table in MySql without the need to specify each field. This is because the table can change in future and might break duplication. I will be duplicating MySQL records from PHP.

It is a problem because in a 'SELECT * ' query MySql will try to copy the ID of the record being copied which genenerates a duplicate ID error.

This blocks out: INSERT INTO customer SELECT * FROM customer WHERE customerid=9181. It also blocks out INSERT INTO customer (Field1, Field2, ...) SELECT Field1, Field2, ..... FROM customer WHERE customerid=9181.

Is there a way to do this from PHP or MySQL?

like image 524
Pasta Avatar asked Oct 27 '09 18:10

Pasta


People also ask

How do you duplicate a record in SQL?

To select duplicate values, you need to create groups of rows with the same values and then select the groups with counts greater than one. You can achieve that by using GROUP BY and a HAVING clause.

Can MySQL have duplicate rows?

MySQL is a database application that stores data in tables in the form of rows and columns. This database application can store duplicate records in the table, which can impact the performance of the database in MySQL.

How do I duplicate a row?

Say you have the following data set and want to copy Row 7 to Row 8. Select the row you want to copy by clicking on a row number (here, Row 7), then right-click anywhere in the selected area and choose Copy (or use the keyboard shortcut CTRL + C).


3 Answers

I finally found this code. I am sure it will help people in the future. So here it is.

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;
}

Here is the link to the article http://www.epigroove.com/posts/79/how_to_duplicate_a_record_in_mysql_using_php

like image 181
Pasta Avatar answered Sep 22 '22 22:09

Pasta


What about

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

Seems to work for me like that. Substitute your table, fields, condition of course.

The null lets the DB generate the auto-increment ID for you.

like image 26
itsmatt Avatar answered Sep 26 '22 22:09

itsmatt


Options:

  1. Avoid using the * wildcard, and specify all the columns yourself. But you say the table is expected to change in the future and this isn't a workable solution for your case.

  2. Introspect the columns from the current table definition (using DESCRIBE or by querying INFORMATION_SCHEMA.COLUMNS). Use this information about metadata to build the query, omitting the auto-increment primary key column.

  3. Do the SELECT * query, fetch the row back into your application, and then remove the auto-increment column from it. Then use that tuple to construct an INSERT statement.

In short, you have a complex requirement to adapt to changing metadata. That probably can't be done in a single query.

like image 35
Bill Karwin Avatar answered Sep 26 '22 22:09

Bill Karwin