2014-11-22 249 views
0

我在MySQL數據庫中的兩個表:「stock_pricing」和「DATA_IMPORT」MySql的觸發INSERT ...對重複密鑰更新不承認列

列第一表格:STOCK_IDDATELAST_CLOSE_DOM_CURR 列第二表格:STOCK_ID,DATE,ADJ_CLOSE

第一個表格有一個關於stock_id和date的索引。這些被定義爲UNIQUE。 第二個表根本沒有索引。

第二個表有接收的數據。在此表上有一個BEFORE INSERT觸發器,用於將傳入數據插入到第一個表中。

如果在插入觸發器上STOCK_ID和DATE的組合違反了第一個表的UNIQUE索引,觸發器的ON DUPLICATE KEY UPDATE部分被觸發。

我想盡組合,我能想到的,但觸發不承認我的列名,有什麼想法?非常感謝。

BEGIN 
INSERT INTO stock_pricing (`STOCK_ID`, `DATE`, `LAST_CLOSE_DOM_CURR`) 
VALUES (DATA_IMPORT.STOCK_ID, DATA_IMPORT.DATE, DATA_IMPORT.ADJ_CLOSE) 
ON DUPLICATE KEY UPDATE 
stock_pricing.STOCK_ID= DATA_IMPORT.STOCK_ID, stock_pricing.DATE= DATA_IMPORT.DATE, stock_pricing.LAST_CLOSE_DOM_CURR= DATA_IMPORT.ADJ_CLOSE; 
END 

回答

0

您引用的表稱爲data_import沒有from條款。這是使用insert . . . select固定:

INSERT INTO stock_pricing (`STOCK_ID`, `DATE`, `LAST_CLOSE_DOM_CURR`) 
    SELECT DATA_IMPORT.STOCK_ID, DATA_IMPORT.DATE, DATA_IMPORT.ADJ_CLOSE 
    FROM DATA_IMPORT 
    ON DUPLICATE KEY UPDATE 
    stock_pricing.STOCK_ID= DATA_IMPORT.STOCK_ID, stock_pricing.DATE= DATA_IMPORT.DATE, stock_pricing.LAST_CLOSE_DOM_CURR= DATA_IMPORT.ADJ_CLOSE; 

寫這樣的查詢的更典型的方式是:

INSERT INTO stock_pricing (`STOCK_ID`, `DATE`, `LAST_CLOSE_DOM_CURR`) 
    SELECT di.STOCK_ID, di.DATE, di.ADJ_CLOSE 
    FROM DATA_IMPORT di 
    ON DUPLICATE KEY UPDATE STOCK_ID = VALUES(STOCK_ID), 
          DATE = VALUES(DATE), 
          LAST_CLOSE_DOM_CURR = VALUES(LAST_CLOSE_DOM_CURR); 

對於ON DUPLICATE KEY UPDATE工作,你需要一個唯一索引或主鍵。我假設你有這些。

最後,這段代碼對於觸發器看起來有點奇怪,因爲沒有引用NEWOLD。如果您仍然遇到觸發問題,請詢問另一個問題,幷包含觸發器的完整代碼。

+0

謝謝戈登。那裏是唯一的鑰匙。我發佈的代碼是我的完整代碼,我從Mqsql參考手冊中獲得了我的領導地位。我已經試過你的代碼,但仍然不幸仍然得到相同的響應:SQL錯誤(1054)未知列'ADJ_CLOSE'字段列表中'。 – Mark 2014-11-22 13:57:23

+0

@ user3237164。 。 。這應該是'VALUES(LAST_CLOSE_DOM_CURR)',新表中列的名稱。 – 2014-11-22 14:00:19

+0

DATA_IMPORT.ADJ_CLOSE值輸入到stock_pricing.LAST_CLOSE_DOM_CURR,LAST_CLOSE_DOM_CURR = VALUES(LAST_CLOSE_DOM_CURR)如何工作?爲什麼不是這樣:LAST_CLOSE_DOM_CURR = VALUES(di.ADJ_CLOSE)?偶然也不起作用。我很困惑。是否因爲在觸發觸發器的重複部分時,di.ADJ_CLOSE值已經傳遞給LAST_CLOSE_DOM_CURR值? – Mark 2014-11-22 14:18:26