Mysql:复制行,但与新的ID

我有一个表“testing”与自动递增的id和任意数量的列。

我想在这个表中创build一个行的副本,所有的列除了id之外都是一样的。

有没有办法做到这一点,而不命名所有列?

我认为INSERT... SELECT... ON DUPLICATE KEY会帮助我,直到我意识到它从不进行INSERT ON DUPLICATE ,它只是更新现有的行。

让我们说你的桌子有以下领域:

 ( pk_id int not null auto_increment primary key, col1 int, col2 varchar(10) ) 

那么,使用新的键值将一行中的值复制到另一行,以下查询可能会有所帮助

 insert into my_table( col1, col2 ) select col1, col2 from my_table where pk_id=?; 

这将为pk_id字段生成一个新值,并从所选行的col1col2中复制值。

您可以扩展此示例以应用表中的更多字段。

更新
在JohnP和Martin的评论中,

我们可以使用临时表先从主表缓冲,然后再用它复制到主表。 只是在临时表中更新pk引用字段将无济于事,因为它可能已经存在于主表中。 相反,我们可以从临时表中删除pk字段,并将所有其他字段复制到主表中。

提到Tim Ruehsen在提到的文章中的回答:

 CREATE TEMPORARY TABLE tmp SELECT * from my_table WHERE ...; ALTER TABLE tmp drop pk_id; # drop autoincrement field # UPDATE tmp SET ...; # just needed to change other unique keys INSERT INTO my_table SELECT 0,tmp.* FROM tmp; DROP TEMPORARY TABLE tmp; 

希望这可以帮助。

这工作仅用于复制一行

  • 从你的表中select你的一行
  • 取所有关联
  • 取消设置ID行(唯一索引键)
  • 将数组[0]键拼成列名
  • 将数组[0]值内插到列值中
  • 运行查询

代码:

  $qrystr = "SELECT * FROM mytablename WHERE id= " . $rowid; $qryresult = $this->connection->query($qrystr); $result = $qryresult->fetchAll(PDO::FETCH_ASSOC); unset($result[0]['id']); //Remove ID from array $qrystr = " INSERT INTO mytablename"; $qrystr .= " ( " .implode(", ",array_keys($result[0])).") "; $qrystr .= " VALUES ('".implode("', '",array_values($result[0])). "')"; $result = $this->connection->query($qrystr); return $result; 

当然,您应该使用PDO:bindparam并检查您的variables是否受到攻击等,但举例说明

附加信息

如果您在处理NULL值时遇到问题,则可以使用以下代码,以便仅为其值不为NULL imploding名称和值生成内部代码。

 foreach ($result[0] as $index => $value) { if ($value === null) unset($result[0][$index]); } 

这适用于MySQL所有版本和Amazon RDS Aurora:

 INSERT INTO my_table SELECT 0,tmp.* FROM tmp; 

要么

将索引列设置为NULL,然后执行INSERT。

但是在MariaDB中,我testing了版本10。

 INSERT into table_name ( `product_id`, `other_products_url_id`, `brand`, `title`, `price`, `category`, `sub_category`, `quantity`, `buy_now`, `buy_now_url`, `is_available`, `description`, `image_url`, `image_type`, `server_image_url`, `reviews`, `hits`, `rating`, `seller_name`, `seller_desc`, `created_on`, `modified_on`, `status`) SELECT `product_id`, `other_products_url_id`, `brand`, `title`, `price`, `category`, `sub_category`, `quantity`, `buy_now`, concat(`buy_now_url`,'','#test123456'), `is_available`, `description`, `image_url`, `image_type`, `server_image_url`, `reviews`, `hits`, `rating`, `seller_name`, `seller_desc`, `created_on`, `modified_on`, `status` FROM `table_name` WHERE id='YourRowID';