Duplicate / Copy records in the same MySQL table

前端 未结 9 1041
我在风中等你
我在风中等你 2020-12-04 06:27

I have been looking for a while now but I can not find an easy solution for my problem. I would like to duplicate a record in a table, but of course, the unique primary key

相关标签:
9条回答
  • 2020-12-04 06:42

    I just wanted to extend Alex's great answer to make it appropriate if you happen to want to duplicate an entire set of records:

    SET @x=7;
    CREATE TEMPORARY TABLE tmp SELECT * FROM invoices;
    UPDATE tmp SET id=id+@x;
    INSERT INTO invoices SELECT * FROM tmp;
    

    I just had to do this and found Alex's answer a perfect jumping off point!. Of course, you have to set @x to the highest row number in the table (I'm sure you could grab that with a query). This is only useful in this very specific situation, so be careful using it when you don't wish to duplicate all rows. Adjust the math as necessary.

    0 讨论(0)
  • 2020-12-04 06:44

    A late answer I know, but it still a common question, I would like to add another answer that It worked for me, with only using a single line insert into statement, and I think it is straightforward, without creating any new table (since it could be an issue with CREATE TEMPORARY TABLE permissions):

    INSERT INTO invoices (col_1, col_2, col_3, ... etc)
      SELECT
        t.col_1,
        t.col_2,
        t.col_3,
        ...
        t.updated_date,
      FROM invoices t;
    

    The solution is working for AUTO_INCREMENT id column, otherwise, you can add ID column as well to statement:

    INSERT INTO invoices (ID, col_1, col_2, col_3, ... etc)
      SELECT
        MAX(ID)+1,
        t.col_1,
        t.col_2,
        t.col_3,
        ... etc ,
      FROM invoices t;
    

    It is really easy and straightforward, you can update anything else in a single line without any second update statement for later, (ex: update a title column with extra text or replacing a string with another), also you can be specific with what exactly you want to duplicate, if all then it is, if some, you can do so.

    0 讨论(0)
  • 2020-12-04 06:46

    Your approach is good but the problem is that you use "*" instead enlisting fields names. If you put all the columns names excep primary key your script will work like charm on one or many records.

    INSERT INTO invoices (iv.field_name, iv.field_name,iv.field_name ) SELECT iv.field_name, iv.field_name,iv.field_name FROM invoices AS iv WHERE iv.ID=XXXXX

    0 讨论(0)
  • 2020-12-04 06:47

    You KNOW for sure, that the DUPLICATE KEY will trigger, thus you can select the MAX(ID)+1 beforehand:

    INSERT INTO invoices SELECT MAX(ID)+1, ... other fields ... FROM invoices AS iv WHERE iv.ID=XXXXX 
    
    0 讨论(0)
  • 2020-12-04 06:56

    Slight variation, main difference being to set the primary key field ("varname") to null, which produces a warning but works. By setting the primary key to null, the auto-increment works when inserting the record in the last statement.

    This code also cleans up previous attempts, and can be run more than once without problems:

    DELETE FROM `tbl` WHERE varname="primary key value for new record";
    DROP TABLE tmp;
    CREATE TEMPORARY TABLE tmp SELECT * FROM `tbl` WHERE varname="primary key value for old record";
    UPDATE tmp SET varname=NULL;
    INSERT INTO `tbl` SELECT * FROM tmp;
    
    0 讨论(0)
  • 2020-12-04 06:58

    The way that I usually go about it is using a temporary table. It's probably not computationally efficient but it seems to work ok! Here i am duplicating record 99 in its entirety, creating record 100.

    CREATE TEMPORARY TABLE tmp SELECT * FROM invoices WHERE id = 99;
    
    UPDATE tmp SET id=100 WHERE id = 99;
    
    INSERT INTO invoices SELECT * FROM tmp WHERE id = 100;
    

    Hope that works ok for you!

    0 讨论(0)
提交回复
热议问题