Mysql 插入到表中强制新主键

Mysql 插入到表中强制新主键,mysql,insert,auto-increment,Mysql,Insert,Auto Increment,在MySQL中,我想复制几条记录,但因为有大量列,所以我不想在insert中列出表中的每个列名。我试着用一个ON-replicate-KEY子句进行惰性插入,但没有成功。我先把记录复制到一个临时表中。设置如下所示: CREATE TABLE copy_of_test LIKE test; INSERT INTO copy_of_test SELECT * FROM test WHERE some_column IN (@X, @Y, @Z); UPDATE copy_of_test SET so

在MySQL中,我想复制几条记录,但因为有大量列,所以我不想在insert中列出表中的每个列名。我试着用一个ON-replicate-KEY子句进行惰性插入,但没有成功。我先把记录复制到一个临时表中。设置如下所示:

CREATE TABLE copy_of_test LIKE test;
INSERT INTO copy_of_test SELECT * FROM test WHERE some_column IN (@X, @Y, @Z);
UPDATE copy_of_test SET some_other_column = @NewValue;
INSERT INTO test SELECT * FROM copy_of_test
ON DUPLICATE KEY UPDATE test.idTest = last_insert_id(test.idTest);
INSERT INTO test SELECT * FROM copy_of_test
ON DUPLICATE KEY AUTO_INCREMENT test PRIMARY KEY;
最后一次插入将显示:

查询正常,0行受影响(0.00秒) 记录:3个重复:0警告:0

但测试中没有插入任何记录。我尝试了这个查询的各种其他版本,但只得到了关于语法或列名歧义的错误消息。我错过了什么

我真正想要的是这样的东西:

CREATE TABLE copy_of_test LIKE test;
INSERT INTO copy_of_test SELECT * FROM test WHERE some_column IN (@X, @Y, @Z);
UPDATE copy_of_test SET some_other_column = @NewValue;
INSERT INTO test SELECT * FROM copy_of_test
ON DUPLICATE KEY UPDATE test.idTest = last_insert_id(test.idTest);
INSERT INTO test SELECT * FROM copy_of_test
ON DUPLICATE KEY AUTO_INCREMENT test PRIMARY KEY;
这里有一个(非常)快速且肮脏的方法应该有效:

CREATE TABLE copy_of_test LIKE test;
INSERT INTO copy_of_test SELECT * FROM test WHERE some_column IN (@X, @Y, @Z);
UPDATE copy_of_test SET some_other_column = @NewValue;
UPDATE copy_of_test SET idTest = idTest + (SELECT MAX(idTest) FROM test); -- here's where the magic happens
INSERT INTO test SELECT * FROM copy_of_test
编辑-这里有另一种类似的不使用子查询的快速脏方法:(如果存在其他唯一性限制,这将不起作用。)


不过,在我看来,你不应该仅仅为了逃避写下所有的列名而使用这种伎俩。仅仅为一个查询创建一个临时表(也可以用一条语句进行查询)绝对不是一个好的解决方案。您可能希望找到一种以编程方式创建语句的方法<代码>测试中的显示列可以是您的朋友。

这已变得毫无意义,因为其他四列上的唯一键未被更改,因此它们违反了唯一性。好的,是的。你说得对,第二个版本就不行了。