一尘不染

复制行但使用新ID

mysql

我有一个表“测试”,具有自动递增id和任意数量的列。

我想在此表中复制一行id,当然所有的列都相同。

有没有一种方法可以不命名所有列?

我以为INSERT... SELECT... ON DUPLICATE KEY会对我有所帮助,直到我意识到它永远不会产生INSERT ON DUPLICATE,它只会更新现有行。


阅读 224

收藏
2020-05-17

共1个答案

一尘不染

假设您的表格包含以下字段:

( 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领域和值复制col1,并col2选定行的。

您可以扩展此示例以在表中申请更多字段。

更新
在适当尊重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;

希望这可以帮助。

2020-05-17