In MySQL, can I copy one row to insert into the same table?

后端 未结 26 2143
-上瘾入骨i
-上瘾入骨i 2020-11-27 09:56
insert into table select * from table where primarykey=1

I just want to copy one row to insert into the same table (i.e., I want to duplicate an ex

相关标签:
26条回答
  • 2020-11-27 10:26

    This procedure assumes that:

    • you don't have _duplicate_temp_table
    • your primary key is int
    • you have access to create table

    Of course this is not perfect, but in certain (probably most) cases it will work.

    DELIMITER $$
    CREATE PROCEDURE DUPLICATE_ROW(copytable VARCHAR(255), primarykey VARCHAR(255), copyid INT, out newid INT)
    BEGIN
            DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @error=1;
            SET @temptable = '_duplicate_temp_table';
            SET @sql_text = CONCAT('CREATE TABLE ', @temptable, ' LIKE ', copytable);
            PREPARE stmt FROM @sql_text;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;
            SET @sql_text = CONCAT('INSERT INTO ', @temptable, ' SELECT * FROM ', copytable, ' where ', primarykey,'=', copyid);
            PREPARE stmt FROM @sql_text;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;
            SET @sql_text = CONCAT('SELECT max(', primarykey, ')+1 FROM ', copytable, ' INTO @newid');
            PREPARE stmt FROM @sql_text;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;
            SET @sql_text = CONCAT('UPDATE ', @temptable, ' SET ', primarykey, '=@newid');
            PREPARE stmt FROM @sql_text;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;
            SET @sql_text = CONCAT('INSERT INTO ', copytable, ' SELECT * FROM ', @temptable, '');
            PREPARE stmt FROM @sql_text;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;
            SET @sql_text = CONCAT('DROP TABLE ', @temptable);
            PREPARE stmt FROM @sql_text;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;
            SELECT @newid INTO newid;
    END $$
    DELIMITER ;
    
    CALL DUPLICATE_ROW('table', 'primarykey', 1, @duplicate_id);
    SELECT @duplicate_id;
    
    0 讨论(0)
  • 2020-11-27 10:26

    clone row with update fields and auto increment value

    CREATE TEMPORARY TABLE `temp` SELECT * FROM `testing` WHERE id = 14;
    
    UPDATE `temp` SET id = (SELECT id FROM testing ORDER by id DESC LIMIT 1
     )+1, user_id = 252 ,policy_no = "mysffffdd12" where id = 14;
    
    INSERT INTO `testing` SELECT * FROM `temp`;
    
    DROP TEMPORARY TABLE IF EXISTS `temp`;
    
    0 讨论(0)
  • 2020-11-27 10:26

    Sorry for the necropost but this is what I turned up with google and since I found this helpful but problematic I wanted to contribute an important modification for anyone else who digs this up.

    First off, I'm using SQL Server, not MySQL, but I think it should work similarly. I used Leonard Challis' solution because it was simplest and met the need, however there's a problem with this - if you simply take the PK and increment it by 1 then what happens if you've added other records since the row in question was added. I decided it was best to just let the system handle the autoincrementing of the PK, so I did the following:

    SELECT * INTO #tmpTable FROM Table WHERE primarykey = 1
    --Optionally you can modify one or more fields here like this: 
    --UPDATE #tmpTable SET somefield = newData
    ALTER TABLE #tmpTable DROP COLUMN TicketUpdateID
    INSERT INTO Tickets SELECT * FROM #tmpTable
    DROP TABLE #tmpTable
    

    I believe this would work similarly in MySQL, but I can't test this, sorry

    0 讨论(0)
  • 2020-11-27 10:26

    For a very simple solution, you could use PHPMyAdmin to export the row as a CSV file then simply import the amended CSV file. Editing the ID/primarykey column to show a 0 for the primarykey value before you import it.

    SELECT * FROM table where primarykey=1
    

    Then at the bottom of the page:

    Where is says "Export" simply export, then edit the csv file to remove the primarykey value, so it's empty, and then just import it into the database, a new primarykey will be assigned on import.

    0 讨论(0)
  • 2020-11-27 10:30

    I would use below,

    insert into ORDER_ITEM select * from ORDER_ITEM where ITEM_NUMBER =123;
    
    0 讨论(0)
  • 2020-11-27 10:30

    I used in my Koha database to insert duplicate items with the 'C' prefix in barcode column:

    INSERT INTO items (`biblionumber`, `biblioitemnumber`, `barcode`, `dateaccessioned` ) SELECT `biblionumber`, `biblioitemnumber`,  CONCAT('C',`barcode`), `dateaccessioned` FROM `items` WHERE barcode='14832';
    
    0 讨论(0)
提交回复
热议问题