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

后端 未结 26 2381
-上瘾入骨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:22

    I know it's an old question, but here is another solution:

    This duplicates a row in the main table, assuming the primary key is auto-increment, and creates copies of linked-tables data with the new main table id.

    Other options for getting column names:
    -SHOW COLUMNS FROM tablename; (Column name: Field)
    -DESCRIBE tablename (Column name: Field)
    -SELECT column_name FROM information_schema.columns WHERE table_name = 'tablename' (Column name: column_name)

    //First, copy main_table row
    $ColumnHdr='';
    $Query="SHOW COLUMNS FROM `main_table`;";
    $Result=Wrappedmysql_query($Query,$link,__FILE__,__LINE__);
    while($Row=mysql_fetch_array($Result))
    {
        if($Row['Field']=='MainTableID')     //skip main table id in column list
            continue;
        $ColumnHdr.=",`" . $Row['Field'] . "`";
    }
    $Query="INSERT INTO `main_table` (" . substr($ColumnHdr,1) . ")
            (SELECT " . substr($ColumnHdr,1) . " FROM `main_table`
                WHERE `MainTableID`=" . $OldMainTableID . ");";
    $Result=Wrappedmysql_query($Query,$link,__FILE__,__LINE__);
    $NewMainTableID=mysql_insert_id($link);
    
    //Change the name (assumes a 30 char field)
    $Query="UPDATE `main_table` SET `Title`=CONCAT(SUBSTRING(`Title`,1,25),' Copy') WHERE `MainTableID`=" . $NewMainTableID . ";";
    $Result=Wrappedmysql_query($Query,$link,__FILE__,__LINE__);
    
    //now copy in the linked tables
    $TableArr=array("main_table_link1","main_table_link2","main_table_link3");
    foreach($TableArr as $TableArrK=>$TableArrV)
    {
        $ColumnHdr='';
        $Query="SHOW COLUMNS FROM `" . $TableArrV . "`;";
        $Result=Wrappedmysql_query($Query,$link,__FILE__,__LINE__);
        while($Row=mysql_fetch_array($Result))
        {
            if($Row['Field']=='MainTableID')     //skip main table id in column list, re-added in query
                continue;
            if($Row['Field']=='dbID')    //skip auto-increment,primary key in linked table
                continue;
            $ColumnHdr.=",`" . $Row['Field'] . "`";
        }
    
        $Query="INSERT INTO `" . $TableArrV . "` (`MainTableID`," . substr($ColumnHdr,1) . ")
                (SELECT " . $NewMainTableID . "," . substr($ColumnHdr,1) . " FROM `" . $TableArrV . "`
                 WHERE `MainTableID`=" . $OldMainTableID . ");";
        $Result=Wrappedmysql_query($Query,$link,__FILE__,__LINE__);
    }
    

提交回复
热议问题