2014-06-17 71 views
0

我有一个数据库:groupofficecom有两个表:INSERT INTO ... SELECT - 主键冲突 - 错误#1062

cal_events: id(Primary key), name, start_time, description,.... 
cf_cal_events: model_id (Primary key), col_1, col_2, col_3,.... 

我想执行以下代码:

INSERT INTO groupofficecom.cf_cal_events (model_id,col_1,col_2,....) 
SELECT groupofficecom.cal_events.ID, '0' AS col_1, '' AS col_2,.... 
FROM groupofficecom.cal_events 

但它不断给我的错误#1062 - 重复录入“155”(“155”是从cal_events“身份证”)关键“主要”

我想主键model_id是相同的值id在cal_events中,因为表cf_cal_events只是cal_events的补充字段(这是一个程序,所以我不能更改它的数据库,它将在第一次更新时消失)

谢谢各位!

+0

身份证号码155已在表中插入你查询 – Sadikhasan

+0

之前存在你检查,看看是否有在cf_cal_events表中的值“155”? – codemonkey

+0

cf_cal_events为空!这就是问题所在,我想插入有一些重复我找不到,没有其他合理的解释 – rand

回答

0

其实我发现了一个很不错的功能,这是非常相似的,但INSERT聪明:

REPLACE INTO database (column_1, column_2) 
SELECT source_column1, 'value' AS column2 
FROM table; 

或者:

REPLACE INTO database (column_1, column_2) 
VALUES ('value1', 'value2') 
FROM table; 

功效神奇!

它插入新项目到目标表,如果它发现具有相同主键值的行时,它会清除它,并重新插入新的值(它从另一个更新表的伟大工程)

我希望这能解决你的问题好像解决了我的。)

1

这意味着在目标表中已经有一个具有该标识的条目。首先,检查这可能是怎么回事。

然后,根据需要使用此处所述的解决方案之一: "INSERT IGNORE" vs "INSERT ... ON DUPLICATE KEY UPDATE" 即UPDATE或IGNORE。

你应该使用一个ORDER BY与你有的选择和上面的解决方案来选择忽略哪些条目(除IGNORE以外的所有条目)。

也可能您希望完全不同,即使用UPDATE语句而不是INSERT语句。

+0

这也是一个关于这个主题的非常好的文章:http://www.xaprb.com/blog/2006/02/ 21/flexible-insert-and-update-in-mysql/ – MikkaRin

+0

不,目标表为空,问题必须在插入时,我会尝试'INSERT ON DUPLICATE KEY UPDATE',因为它不是'UPDATE' – rand