2012-11-07 64 views
1

有以下问题MySQL的键对重复密钥更新列是暧昧

INSERT INTO statistics_new (SELECT * FROM statistics) 
    -> 
    -> ON DUPLICATE KEY UPDATE 
    -> 
    -> end_date = IF(end_date < VALUES(end_date), VALUES(end_date), end_date); 
ERROR 1052 (23000): Column 'end_date' in field list is ambiguous 

当我试图为它http://dev.mysql.com/doc/refman/5.0/en/insert-select.html建议我有同样的结果指定列和表的别名。

Server版本:5.5.24-0ubuntu0.12.04.1(Ubuntu的)

下面的查询运行没有问题:

INSERT INTO statistics_new (SELECT * FROM statistics) 
ON DUPLICATE KEY UPDATE 
end_date = VALUES(end_date) 

回答

6

SQLFiddle example

基本上,我想你想的:

INSERT INTO statistics_new (SELECT * FROM statistics) 
ON DUPLICATE KEY UPDATE 
statistics_new.end_date = if(statistics_new.end_date < statistics.end_date, 
          statistics.end_date, statistics_new.end_date); 
+0

为什么我们没有“statistics_new”的行为是如此的强硬。前缀whn在IF中使用IF DUPLICATE KEY UPDATE – user1802525

+0

因为数据库引擎不知道要使用哪个列,因为它在2个表中具有相同的名称。所以你必须给表格命名。 –

+0

此行为尚不清楚。因为1)我们不能将表别名添加到插入表中,并且需要使用全表名作为前缀字段,2)MySQL手册描述了通过VALUES()语句使用插入值的唯一方法,但我们可以使用“selection_table.field”表单目前尚不清楚这种方式是否属于同一种情况。即是“ON DUPLICATE KEY UPDATE inserion.field = VALUES(selection.field)”与“ON DUPLICATE KEY UPDATE insertion.field = selection.field”相同吗? –

1

两个statistics_newstatisticsend_date列。请在您的SQL中区分它们。

0

如果你试图设置一个变量在最后一行应该是相当类似:

SET @end_date = IF(end_date < VALUES(end_date), VALUES(end_date), end_date);