MySql触发器INSERT ... ON DUPLICATE KEY UPDATE无法识别列

时间:2014-11-22 13:21:41

标签: mysql triggers

我在Mysql数据库中有两个表:" stock_pricing"和" DATA_IMPORT"

第一个表中的

列:STOCK_IDDATELAST_CLOSE_DOM_CURR 第二个表格中的列:STOCK_IDDATEADJ_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

1 个答案:

答案 0 :(得分: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的引用。如果您仍然遇到触发器问题,请询问另一个问题,并包含触发器的完整代码。