我有一个表“测试”,具有自动递增id和任意数量的列。
id
我想在此表中复制一行id,当然所有的列都相同。
有没有一种方法可以不命名所有列?
我以为INSERT... SELECT... ON DUPLICATE KEY会对我有所帮助,直到我意识到它永远不会产生INSERT ON DUPLICATE,它只会更新现有行。
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领域和值复制col1,并col2选定行的。
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;
希望这可以帮助。