I realise this was an issue from 5 years ago, but I just found this post while working on my own duplicate record issue, and wanted to add my two cents.
I think it is totally reasonable to duplicate a row in a database when you are creating a new record that is similar to the original record, but one that will be treated as a completely separate entity.
In this instance I don't believe the bad design comment is relevant:
Using the duplicate row query:
1) click copy button
2) Insert record based on data from the old record. 1 query
3) Get the last insert id
4) Make changes to the copy.
The alternative...
1) Click copy button
2) Select record from the database with a query
3) Insert record to the database with another query
4) Get the last insert id
5) Make changes to the copy.
More code is required to achieve steps 2 and 3 using the alternative, and you would have one more trip to the database. Fewer trips to the database = less load.
I'd love to hear your thoughts - I might have it totally wrong.