插入唯一行而不更新旧行

时间:2012-07-23 13:32:28

标签: mysql insert insert-select

我在不同的数据库中有两个相似的表,我想从另一个中插入一个。同时我想确保每次mySql遇到“重复ID”错误时,它会在新表的底部插入行并分配一个新的唯一ID。我试过了:
INSERT...SELECT...ON DUPLICATE KEY UPDATE如果它找到'重复键'而不是更新前一行,我找不到让它插入新行的方法。

3 个答案:

答案 0 :(得分:2)

如果您可以为要复制到目标表的每个记录分配新的id,无论源表中的id是否先前存在于目标中,您都可以不提供id并允许MySQL使用导致NULL值分配的默认auto_increment值:

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

否则,您需要使用NULLIF()之类的内容将id明确设置为已存在的NULL,基于SELECT中的表格加在一起:

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)

答案 1 :(得分: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值,而不是试图强制其中的现有值。

请不要吝啬我的语法,我没有测试过。

答案 2 :(得分: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