0

在 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 将显示:

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

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

我真正想要的是这样的:

INSERT INTO test SELECT * FROM copy_of_test
ON DUPLICATE KEY AUTO_INCREMENT test PRIMARY KEY;
4

1 回答 1

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

编辑 - 这是另一种类似的不使用子查询的快速'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可以成为你的朋友。

于 2013-06-12T22:43:58.640 回答