我有一个表"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)
希望这可以帮助.
小智 5
这适用于 MySQL 所有版本和 Amazon RDS Aurora:
INSERT INTO my_table SELECT 0,tmp.* FROM tmp;
Run Code Online (Sandbox Code Playgroud)
或者
将索引列设置为 NULL,然后执行 INSERT。
但不是在 MariaDB 中,我测试了版本 10。
| 归档时间: |
|
| 查看次数: |
101148 次 |
| 最近记录: |