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?
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.
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.
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).
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
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.
Options:
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With