带主键的Mysql克隆行

时间:2010-01-18 01:40:10

标签: mysql clone row

我有一个带有单个主键(称为pkey)的Mysql表,它自动递增,我想克隆一行,保持所有数据相同,除了主键应该成为下一个可用值由自动增量定义。

我的第一个问题是,以下查询是否可能?

UPDATE `table` SET pkey='next_available_primary_key' WHERE pkey='old_primary_key'

如果已经尝试过

UPDATE `table` SET pkey=null WHERE pkey='old_primary_key'

但它只将主键的值设置为零。提前感谢您的任何帮助/建议。

更新

我想我应该补充一点,我真的不想要表中的两个数据副本。我只想更改主键。因此,如果我使用INSERT SELECT,我将不得不使用ON DUPLICATE KEY UPDATE补偿pkey ='next_available_primary_key'我只是不确定如何做到这一点......

5 个答案:

答案 0 :(得分:7)

如果你想在表格中创建一个新行,你想要INSERT,而不是UPDATE。

这个怎么样?确保您的PKEY设置为自动增量。

INSERT INTO `table` (col,col,col)  /*name all the columns EXCEPT the primary key*/
SELECT col,col,col  /*name all the columns EXCEPT the primary key*/
  FROM 'table`
 WHERE pkey='old_primary_key'

答案 1 :(得分:3)

insert into t select 0,a,b,c,d,e from t where id = some_id

使用0作为auto_increment列的值,mysql将使用下一个可用的...

为新评论编辑,如果您想将ID更改为下一个可用的

update tbl set id = (select auto_increment from
  information_schema.tables where  table_name = 'tbl') where id = 4;

答案 2 :(得分:2)

clone-sql-record上的解决方案怎么样?

CREATE TEMPORARY TABLE %1 ENGINE=MEMORY SELECT * FROM mytable WHERE myid=%2;

UPDATE %1 SET myid=%3;

INSERT INTO mytable SELECT * FROM %1;

DROP TABLE %1;

其中

  • %1为“T”+ raw_time_stamp,ex T20120124132754
  • %2是oldid
  • %3是newid

答案 3 :(得分:0)

使用自动增量主键

克隆表的记录
CREATE TEMPORARY TABLE `tmp` SELECT * FROM `your_table_name`;

UPDATE `tmp` SET id = NULL ;

INSERT INTO `your_table_name` SELECT * FROM `tmp`;

DROP TEMPORARY TABLE IF EXISTS `tmp`;

答案 4 :(得分:0)

请注意,给出的其他解决方案似乎适用于允许主键列为null的源表。由于我不是这种情况,我遇到了一个错误 - 可以通过更改临时表(我希望id成为主键)轻松解决这个问题:

CREATE TEMPORARY TABLE tmp_clone ENGINE=MEMORY 
    SELECT * FROM my_source_table WHERE id=some_id;

ALTER TABLE tmp_clone MODIFY id bigint(20) default null;
UPDATE tmp_clone SET id=null;

INSERT INTO my_source_table SELECT * FROM tmp_clone;

DROP TABLE tmp_clone;

SELECT * from my_source_table where id = last_insert_id();