具有主键的Mysql克隆行

具有主键的Mysql克隆行,mysql,clone,row,Mysql,Clone,Row,我有一个Mysql表,它有一个自动递增的主键(称为pkey),我想克隆一行,使所有数据保持不变,主键除外,它应该成为自动递增定义的下一个可用值 我的第一个问题是,下面的问题可能吗 UPDATE `table` SET pkey='next_available_primary_key' WHERE pkey='old_primary_key' 如果你试过 UPDATE `table` SET pkey=null WHERE pkey='old_primary_key' 但它只将主键的值设置为零

我有一个Mysql表,它有一个自动递增的主键(称为pkey),我想克隆一行,使所有数据保持不变,主键除外,它应该成为自动递增定义的下一个可用值

我的第一个问题是,下面的问题可能吗

UPDATE `table` SET pkey='next_available_primary_key' WHERE pkey='old_primary_key'
如果你试过

UPDATE `table` SET pkey=null WHERE pkey='old_primary_key'
但它只将主键的值设置为零。提前感谢您的帮助/建议

更新:

我想我应该补充一点,我真的不想要表中数据的两个副本。我只想更改主键。因此,如果我使用插入选择,我将不得不补偿使用重复密钥更新pkey='next\u available\u primary\u KEY',我只是不知道如何做到这一点

insert into t select 0,a,b,c,d,e from t where id = some_id
使用0作为auto_increment列的值,mysql将使用下一个可用列

为新注释编辑,如果要将id更改为下一个可用id

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

如果要在表中创建新行,则需要插入,而不是更新

这个怎么样?确保您的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是“T”+原始时间戳,例如T20120124132754
  • %2是旧的
  • %3是纽伊德

使用自动递增的主键克隆表的记录

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`;

注意,给出的其他解决方案似乎适用于允许主键列为null的源表。由于我的情况并非如此,因此我遇到了一个错误——通过更改临时表(我希望
id
是主键),可以很容易地解决这个问题:


所以我考虑过这一点,我可能会使用这个解决方案,但我希望有一个更干净的解决方案,除了主键之外,我不需要列出所有字段。我做了很多这类事情,我使用元数据(information_schema.COLUMNS)来构造我的查询。COLUMNS.COLUMN_KEY='PRI'如果该列是表的主键的一部分,则为空字符串(如果不是)。无论如何,您必须使用一些脚本来构建查询。我认为您还必须根据数据库引擎使用临时表。出于好奇:您的目标是什么?因为您可能会将主键误用于某些目标(如排序数据),而主键并非用于此目的。
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`;
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();