我有一个带有单个主键(称为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'我只是不确定如何做到这一点......
答案 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;
其中
答案 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();