4

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

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

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' 来补偿我只是不知道该怎么做......

4

5 回答 5

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'
于 2010-01-18T01:49:24.037 回答
3

How about the solution found on 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;

where

  • %1 is "T"+raw_time_stamp, ex T20120124132754
  • %2 is oldid
  • %3 is newid
于 2012-01-24T19:44:52.823 回答
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;
于 2010-01-18T01:46:22.753 回答
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`;
于 2016-12-26T12:21:20.187 回答
0

请注意,给出的其他解决方案似乎适用于允许主键列为空的源表。因为这对我来说不是这样,所以我遇到了一个错误——这可以通过更改临时表来轻松解决(我希望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();
于 2017-03-01T13:35:02.747 回答