2012-08-30 84 views
0

我无法获得以下代码以使用此page作为参考以及此站点上的其他帖子。我需要创建一个触发器,只要表A被更新,它就会在表B中插入一条记录。下面的代码显示了我正在尝试的内容;但是这会产生语法错误(#1064)。我还不清楚我是否需​​要包含'DELIMITER $$'语法。我感谢你的帮助MySQL触发器将表A中的记录插入表B

DELIMITER $$ 
CREATE TRIGGER MyTrigger 
AFTER INSERT 
ON TableA 
FOR EACH ROW 
BEGIN 
    INSERT INTO TableB SET 
    TableA_id = NEW.TableB_id, 
    TableA_date = NEW.TableB_date, 
    TableA_comment = NEW.TableB_comment; 
    END; 
END $$ 
DELIMITER ; 

编辑:在伪代码上面,我是用$ TableName_ $字段名惯例,表明A列属于表A,B列属于表B.我应该有在我原来的问题中更加明确。有人在下面评论我在错误的一面有NEW指标(应在表A中),但该评论似乎已被删除。有人可以确认吗?感谢您的帮助

+0

在回答您的编辑:你是说在'TableB'你*不*有一个叫做'TableA_id'列,而是要插入一行到' TableB',使得TableB.TableB_id的值等于TableA.TableA_id的值等等。 – eggyal

+0

@eggyal TableB由TableB_id,TableB_date和TableB_comment组成;同样对于Tabel A.对不起,我的原始问题没有更清楚。我基本上想要在表A更新时在表B中插入相同的记录 – Arkady

+1

在这种情况下,您确实需要在您的INSERT语句中颠倒列名。 'SET TableB_id = NEW.TableA_id'等。 – eggyal

回答

1

试试这个:

DELIMITER $$ 
CREATE TRIGGER MyTrigger 
AFTER INSERT 
ON TableA 
FOR EACH ROW 
BEGIN 
    INSERT INTO TableB SET 
    TableB_id = NEW.TableA_id, 
    TableB_date = NEW.TableA_date, 
    TableB_comment = NEW.TableA_comment; 
END $$ 
DELIMITER ; 

这里的DELIMITER用来告诉MySQL对待所有以下;作为定义的一部分,而不是实际的命令终止。

请注意,我刚刚闭幕END $$

+0

你如何知道'TableB'中的列名? – eggyal

+0

这是什么意思?他在写查询的时候现在已经有了列名,但是如果他想要使用类似UPDATE的sintax进行插入,在左侧他必须有TableB的列名,并且在那个位置他将他想要的值从新插入TableA的一行。我真的不明白你的失望,对我来说没有意义! –

+0

我的意思是,你已经将列名改为OP以外的内容。你怎么比他知道他的桌子上的柱子的名字是什么?无论如何,这并不能解释#1064语法错误。但是,由于您已经删除了错误的“END”,因此您的答案现在提示解决问题的方法,并且已删除我的downvote。也就是说,你的评论“*我认为你在插入错误的字段*”会将注意力转移到实际问题上,并且在列名恢复之前触发器可能无法工作。 – eggyal

1

之前卸下了无与伦比的END;您的触发错误END;(每END应该配搭BEGIN)。

对于这个问题,甚至不需要BEGIN ... END块,因为触发器只包含一条语句(如果该块被省略,则甚至不需要更改语句分隔符,因为不会出现分号CREATE TRIGGER发言):

CREATE TRIGGER MyTrigger AFTER INSERT ON TableA FOR EACH ROW 
    INSERT INTO TableB SET 
    TableA_id = NEW.TableB_id, 
    TableA_date = NEW.TableB_date, 
    TableA_comment = NEW.TableB_comment 
相关问题