我在Mysql数据库中有两个表:" stock_pricing"和" DATA_IMPORT"
第一个表中的列:STOCK_ID
,DATE
,LAST_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 :(得分: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
生效,您需要一个唯一的索引或主键。我猜你有这些。
最后,对于触发器,此代码看起来有点奇怪,因为没有对NEW
或OLD
的引用。如果您仍然遇到触发器问题,请询问另一个问题,并包含触发器的完整代码。