2012-07-23 91 views
0

我在不同数据库中有两个类似的表,我想从另一个数据库中插入一个。同时,我希望确保每次mySql遇到“重复id”错误时,都会将该行插入新表的底部,并指定一个新的唯一标识。我曾尝试过:
INSERT...SELECT...ON DUPLICATE KEY UPDATE
但我找不到一种方法来让它插入到一个新行,如果它找到'重复键'而不是更新前一行。在不更新旧行的情况下插入唯一行

+0

'键'是自动增量值吗?如果是这样,我可能会为你解决。尝试'INSERT INTO table2'SELECT NULL,col1,col2,col3 FROM table1'我手边没有准确的语法,但它应该以这种方式工作。 – ATaylor 2012-07-23 13:36:35

+0

是'钥匙'是一个自动增量字段。谢谢,我会试试这个。 – IROEGBU 2012-07-23 13:40:07

+0

不客气。这听起来很高兴,如果你得到它的工作:) – ATaylor 2012-07-23 13:42:50

回答

2

如果你可以指定新id到每一条记录被复制到目标表,无论在源表中的id是否在目的地以前存在与否,你根本无法提供id,让MySQL来诉诸要分配默认NULL值导致auto_increment值:

INSERT INTO destdb.tbl (colA, colB, colC) 
SELECT colA, colB, colC 
FROM srcdb.tbl 

否则,你将需要使用像NULLIF()明确设置idNULL它已经存在,基于连接表一起:

INSERT INTO destdb.tbl (id, colA, colB, colC) 
SELECT NULLIF(src.id, dst.id), src.colA, src.colB, src.colC 
FROM srcdb.tbl src LEFT JOIN destdb.tbl dst USING (id) 
+0

嗯,我不知道NULLIF。我会尽力记住它,如果我需要这样的东西。 +1 – ATaylor 2012-07-23 14:44:48

+0

@ATaylor:在MySQL中有很多方便的功能被隐藏起来;在火车上无聊时花费一个小时浏览手册页是非常值得的。为我节省了很多痛苦! :) – eggyal 2012-07-23 15:05:14

+0

是的,我确切地知道你的意思:)不幸的是,与互联网接入的“火车游乐设施”对我来说非常罕见:D – ATaylor 2012-07-23 15:09:53

1

据当时http://dev.mysql.com/doc/refman/5.1/de/insert-select.html的文档,这可能与查询来实现:

INSERT INTO `table2` SELECT (NULL, col1, col2, col3) FROM `table1` 

这种方式,自动增量值是留给“NULL”,导致发动机给它是一个新的AI值,而不是试图强制现有的AI值。

请不要让我的语法,我没有测试过这个。

0
If the id is autoincrement: 
Create an additional column in the second table with a reference to the id value in the first table 
Sample Select Query: 

SELECT unique_id, data FROM table_1 WHERE id='$id' 

Sample Insert Query: 

INSERT INTO table_2 (table_1_unique_id, data) VALUES ($unique_id_from_first_table, $data) 

This will solve any duplicate id problems and allow referencing between the two tables 
相关问题