2015-01-04 25 views
0

我想在MySql中创建一个触发器,以便在表A中插入一些值,并且如果记录已经存在,我想重新计算其中一个字段,但我一直在获取语法错误:基于触发器中的sub squery计算值

1064 - 您的SQL语法错误;检查对应于你的MySQL服务器版本使用附近的 'P1

INNER JOIN ( SELECT SUM(ATS)AS TOTAGAINST,TOURNID,HOMETEAM,ROUNDID' 第6行

下面是正确的语法手册我的代码(剥离用于调试):

DROP TRIGGER IF EXISTS `trig_matches_insert`; 
DELIMITER // 
CREATE TRIGGER `trig_matches_insert` AFTER INSERT ON `matches` 
FOR EACH ROW 
BEGIN 
INSERT INTO positions (TEAMID, SC_AGAINST, SC_FOR, ROUNDID, TOURNID) values  
(new.HOMETEAM, new.ATS, new.HTS, new.ROUNDID, new.TOURNID) 
ON DUPLICATE KEY 
UPDATE positions P1 
INNER JOIN 
(
SELECT SUM(ATS) AS TOTAGAINST, TOURNID, HOMETEAM, ROUNDID FROM matches GROUP BY 
TOURNID,HOMETEAM, ROUNDID 
) P2 ON P2.HOMETEAM = P1.TEAMID AND P2.TOURNID = P1.TOURNID AND P2.ROUNDID = P1.ROUNDID 
SET P1.SC_AGAINST = P2.TOTAGAINST WHERE P1.ID = 10; 
END 
// 
DELIMITER ; 

我不能告诉什么是错在这里.. 当我运行更新查询单机运行良好

下面是一些支承实婷SQL:

CREATE TABLE IF NOT EXISTS `matches` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `TOURNID` int(11) NOT NULL, 
    `HOMETEAM` int(11) NOT NULL, 
    `AWAYTEAM` int(11) NOT NULL, 
    `HTS` decimal(10,0) NOT NULL, 
    `ATS` decimal(10,0) NOT NULL, 
    `FIELD` text NOT NULL, 
    `TIME` datetime NOT NULL, 
    `ROUNDID` int(11) NOT NULL, 
    PRIMARY KEY (`ID`), 
    KEY `TOURNID` (`TOURNID`), 
    KEY `HOMETEAM` (`HOMETEAM`), 
    KEY `AWAYTEAM` (`AWAYTEAM`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ; 

INSERT INTO `matches` (`ID`, `TOURNID`, `HOMETEAM`, `AWAYTEAM`, `HTS`, `ATS`, `FIELD`, `TIME`, `ROUNDID`) VALUES 
(17, 1, 30, 31, '2', '3', '', '2015-01-04 00:00:00', 1), 
(18, 1, 30, 3, '2', '4', '', '2015-01-04 00:00:00', 1), 
(19, 1, 30, 4, '3', '5', '', '2015-01-04 00:00:00', 1); 

CREATE TABLE IF NOT EXISTS `positions` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `TOURNID` int(11) NOT NULL, 
    `TEAMID` int(11) NOT NULL, 
    `ROUNDID` int(11) NOT NULL, 
    `SC_FOR` decimal(10,0) NOT NULL, 
    `SC_AGAINST` decimal(10,0) NOT NULL, 
    `POULEID` int(11) NOT NULL, 
    PRIMARY KEY (`ID`), 
    UNIQUE KEY `TOURNID_2` (`TOURNID`,`TEAMID`,`ROUNDID`), 
    KEY `TOURNID` (`TOURNID`,`TEAMID`), 
    KEY `TEAMID` (`TEAMID`), 
    KEY `ROUND` (`ROUNDID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ; 

    INSERT INTO `positions` (`ID`, `TOURNID`, `TEAMID`, `ROUNDID`, `SC_FOR`, `SC_AGAINST`, `POULEID`) VALUES 
(10, 1, 30, 1, '2', '12', 0); 

在此先感谢

迈克

+1

此特定错误的根源在于'在'重复键UPDATE'条款INSERT INTO'仅支持表达式。它不是全面的UPDATE语句。现在为了帮助您,您需要显示表格模式和一些示例数据。 – peterm

+0

谢谢你的帮助彼得。我在上面添加了架构和示例数据.. –

回答

0

想我已经找到了,看起来像后重复键的位置表已经得到了范围,不需要从头开始构建和更新语句,似乎是一个快速的选择会做得很好:

DROP TRIGGER IF EXISTS `matches_after_ins_trig`; 
DELIMITER // 
CREATE TRIGGER `matches_after_ins_trig` AFTER INSERT ON `matches` 
FOR EACH ROW 
BEGIN 
INSERT INTO positions (TEAMID, SC_AGAINST, SC_FOR, ROUNDID, TOURNID) values  (new.HOMETEAM, new.ATS, new.HTS, new.ROUNDID, new.TOURNID) 
ON DUPLICATE KEY UPDATE SC_AGAINST = (SELECT SUM(ATS) FROM matches WHERE 
matches.HOMETEAM = new.HOMETEAM AND matches.TOURNID = new.TOURNID AND 
matches.ROUNDID = new.ROUNDID GROUP BY TOURNID,HOMETEAM, ROUNDID); 
END