2012-11-07 63 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);