2016-05-23 148 views
1

嗨,大家好,我试图做一些触发器更新后插入其他表中的一个表中,但它报告我一个错误。两个表具有相同的字段和相同的名称。错误触发器插入后插入

这是代码。

DELIMITER // 

CREATE TRIGGER Insertar_Bares_Private AFTER INSERT ON Bares 
FOR EACH ROW 
BEGIN 
INSERT INTO Bares_Private (nombrebar, direccion) VALUES (new.nombrebar, new.direccion); 
END// 

CREATE TRIGGER Insertar_Categorias_Private AFTER INSERT ON Categorias 
FOR EACH ROW 
BEGIN 
INSERT INTO Categorias_Private (nombrecategoria) VALUES (new.nombrecategoria); 
END// 

CREATE TRIGGER Insertar_Productos_Private AFTER INSERT ON Productos 
FOR EACH ROW 
BEGIN 
INSERT INTO Productos_Private (nombreproducto, idcategoria, descripcion, precio, imagen) VALUES (new.nombreproducto, new.idcategoria, new.descripcion, new.precio, new.imagen); 
END// 

-- Triggers al actualizar 

CREATE TRIGGER Actualizar_Usuarios_Private AFTER UPDATE on Usuarios 
for each ROW 
BEGIN 
UPDATE Usuarios_Private 
SET nombreusuario=new.nombreusuario, contrasenia=new.contrasenia, email=new.email, telefono=new.telefono 
where idusuario=new.idusuario; 
END// 

CREATE TRIGGER Actualizar_Bares_Private AFTER UPDATE on Bares 
for each ROW 
BEGIN 
UPDATE Bares_Private 
SET nombrebar=new.nombrebar, direccion=new.direccion 
where idbar=new.idbar; 
END// 

CREATE TRIGGER Actualizar_Categorias_Private AFTER UPDATE on Categorias 
for each ROW 
BEGIN 
UPDATE Categorias_Private 
SET nombrecategoria=new.nombrecategoria 
where idcategoria=new.idcategoria; 
END// 

CREATE TRIGGER Actualizar_Productos_Private AFTER UPDATE on Productos 
for each ROW 
BEGIN 
UPDATE Productos_Private 
SET nombreproducto=new.nombreproducto, idcategoria=new.idcategoria, descripcion=new.descripcion, precio=new.precio, imagen=new.imagen 
where idproducto=new.idproducto; 
END// 

DELIMITER ; 

这里是错误报告。

#1235 - This version of MySQL doesn't yet support 'multiple triggers with the same action time and event for one table' 

谢谢你的建议。

+0

看看这个[发表](http://stackoverflow.com/a/19020753/2451726) – Arulkumar

回答

2

从所有END;中删除;并应用分隔符END//将解决您的问题。

由于您已经为INSERT/UPDATE声明放置了正确的;,因此无需再将它放在END;中。

+0

你是这个意思吗? (见编辑)。它不会对这个错误进行更改。 #1064 - 你的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,在正确的语法附近使用'CREATE TRIGGER Insertar_Bares_Private AFTER INSERT ON Bares FOR EACH ROW BEGIN'在第9行 –

+1

哦,可以尝试设置每个块以您的分隔符结束END //'代替'END;' – Arulkumar

0

如果触发器包含多个查询,则只需在定义触发器之前更改分隔符。这是因为在这种情况下,您需要使用默认分隔符;来分隔触发器中的查询,但MySQL客户端会错误地认为您的意思是在此处终止触发器定义。这还需要您在触发器中的查询块周围使用BEGIN ... END

DELIMITER // 

CREATE TRIGGER Insertar_Usuarios_Private AFTER INSERT ON Usuarios 
FOR EACH ROW 
BEGIN 
INSERT INTO Usuarios_Private (nombreusuario, contrasenia, email,telefono) VALUES (new.nombreusuario, new.contrasenia, new.email, new.telefono); 
END// 

CREATE TRIGGER Insertar_Bares_Private AFTER INSERT ON Bares 
FOR EACH ROW 
BEGIN 
INSERT INTO Bares_Private (nombrebar, direccion) VALUES (new.nombrebar, new.direccion); 
END// 

-- and so on ... 
DELIMITER ; 

但是,您的触发器只包含一个查询。因此,您可以完全取消分隔符和BEGIN ... END块。

CREATE TRIGGER Insertar_Usuarios_Private AFTER INSERT ON Usuarios 
FOR EACH ROW 
INSERT INTO Usuarios_Private (nombreusuario, contrasenia, email,telefono) VALUES (new.nombreusuario, new.contrasenia, new.email, new.telefono); 

CREATE TRIGGER Insertar_Bares_Private AFTER INSERT ON Bares 
FOR EACH ROW 
INSERT INTO Bares_Private (nombrebar, direccion) VALUES (new.nombrebar, new.direccion); 

-- and so on ... 
+0

好的,谢谢,但现在报告错误(请参阅编辑)。我正在使用MySQL 5.5.42,但我不认为我在同一个动作时间和事件中使用了两个触发器。 –

+0

您是否在测试过程中成功添加了一个或多个触发器,现在又试图再次添加相同的触发器?在再次运行命令之前,对每个触发器尝试'DROP TRIGGER IF EXISTS trigger_name;'。 –

+0

在回答问题后,编辑问题以询问完全不同的问题并不是很有帮助。这意味着未来的访问者如果遇到同样的问题,将无法找到它,否则答案将无法理解。我认为,编辑它时最好在问题的底部添加更新,并保留原始材料。 –