2014-11-22 90 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