Mysql:复制行但带有新ID

Mar*_*tin 57 mysql

我有一个表"test",自动递增id和任意数量的列.

我想在这个表中复制一行,所有列都相同id,当然除外.

有没有办法在不命名所有列的情况下执行此操作?

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

Rav*_*ddy 97

我们说你的表有以下字段:

( pk_id int not null auto_increment primary key,
  col1 int,
  col2 varchar(10)
)
Run Code Online (Sandbox Code Playgroud)

然后,使用新的键值将值从一行复制到另一行,以下查询可能有所帮助

insert into my_table( col1, col2 ) select col1, col2 from my_table where pk_id=?;
Run Code Online (Sandbox Code Playgroud)

这将为所选行和所选行的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;
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 但在这里你要说的是要复制哪些列.我不想通过只知道主键的名称来做到这一点. (6认同)
  • **大警告!!** `ALTER TABLE` 会导致隐式事务提交,即使它位于临时表上。而且,实际上,您应该执行`DROP TEMPORARY TABLE tmp;` 以避免在最后一行出现相同的情况,尽管那时已经太晚了。 (3认同)

小智 5

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

INSERT INTO my_table SELECT 0,tmp.* FROM tmp;
Run Code Online (Sandbox Code Playgroud)

或者

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

但不是在 MariaDB 中,我测试了版本 10。

  • 对于此解决方案,我可以通过在末尾添加“WHERE ID=123”来指定要重复的行吗?(或者“tmp”是我想要的行的欺骗?) (2认同)