在MySQL中我想复制几个记录,但因为有大量列我不想列出插入表中的每个列名。我尝试使用ON DUPLICATE KEY子句进行INERT INTO,但它不起作用。我先将记录复制到临时表中。设置如下:
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会显示:
查询OK,0行受影响(0.00秒) 记录:3个重复:0警告:0
但没有记录插入测试中。我尝试了此查询的各种其他版本,但只收到有关列名的语法或歧义的错误消息。我错过了什么?
我真正想要的是这样的:
INSERT INTO test SELECT * FROM copy_of_test
ON DUPLICATE KEY AUTO_INCREMENT test PRIMARY KEY;
答案 0 :(得分:1)
这是一种应该有效的(非常)快速和肮脏的方式:
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
编辑 - 这是另一种类似的quick'n'dirty方式,它不会使用子查询:(如果存在其他唯一性限制,这将无效。)
CREATE TABLE copy_of_test LIKE test;
ALTER TABLE copy_of_test DROP PRIMARY KEY, MODIFY idTest INT;
ALTER TABLE copy_of_test ALTER idTest DROP DEFAULT;
INSERT INTO copy_of_test SELECT * FROM test WHERE some_column IN (@X, @Y, @Z);
UPDATE copy_of_test SET some_other_column = @NewValue, idTest = null;
INSERT INTO test SELECT * FROM copy_of_test
但是,在我看来,你不应该使用这种技巧来解决所有列名称。只是为查询创建一个临时表,也可以使用单个语句创建,这绝对不是一个好的解决方案。您可能希望找到一种以编程方式创建语句的方法。 SHOW COLUMNS IN test
可以成为你的朋友。