2009-12-17 16 views
15

Solo una pregunta rápida que sin duda alguien sabrá la respuesta.¿Múltiples instrucciones de inserción/actualización dentro del desencadenador?

Necesito poder hacer varias inserciones/actualizaciones dentro de un desencadenador. Cada intento termina con el fracaso :(

DROP TRIGGER IF EXISTS `Insert_Article`// 
CREATE TRIGGER `Insert_Article` AFTER INSERT ON `Article` 
FOR EACH ROW insert into FullTextStore (`Table`, `PrimaryKey`, `ColumnName`, `Data`, `Created`) values ('Article', NEW.ArticleID, 'Description', NEW.Description, UNIX_TIMESTAMP()) 
// 

Por el momento, lo anterior simplemente inserta una fila en una tabla cuando los insertos tabla padre. Esto funciona bien.

Para conseguir esto para trabajar con los valores que haya numerosas tiene que hacer

DROP TRIGGER IF EXISTS `Insert_Article`// 
CREATE TRIGGER `Insert_Article` AFTER INSERT ON `Article` 
FOR EACH ROW insert into FullTextStore (`Table`, `PrimaryKey`, `ColumnName`, `Data`, `Created`) 
select 'Article', NEW.ArticleID, 'Description', NEW.Description, UNIX_TIMESTAMP() 
union 
select 'Article', NEW.ArticleID, 'Keywords', NEW.Keywords, UNIX_TIMESTAMP() 
// 

Pero ... Tiene que haber una manera más fácil Cuando intento usar;? para terminar cada declaración, falla con

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL version for the right syntax to use near 'select 'Article', NEW.ArticleID, 'Keywords', 'NEW.Keywords, UNIX_TIMESTAMP())' at line 1 

Ni siquiera puedo obtener varias instrucciones de actualización para trabajar.

Sería de gran ayuda si alguien pudiera señalar lo que estoy haciendo mal?

Saludos

Gavin

Respuesta

21

A partir de los documentos: Create Trigger Syntax

sentencia_disp es la sentencia a ejecutar cuando se activa el gatillo. Si desea ejecutar múltiples instrucciones , use la construcción de instrucciones compuestas BEGIN ... END . Este también le permite utilizar los mismos declaraciones que son admisibles dentro rutinas almacenadas

CREATE TRIGGER testref BEFORE INSERT ON test1 
    FOR EACH ROW BEGIN 
    INSERT INTO test2 SET a2 = NEW.a1; 
    DELETE FROM test3 WHERE a3 = NEW.a1; 
    UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; 
    END; 
+0

Usted es la persona (por ser un mundo del PC n todo eso). Muchas gracias. Creo que había omitido el BEGIN cuando usaba END. – Gavin

Cuestiones relacionadas