Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
1
respuesta

Por qué dentro de un trigger no se puede crer usando truncate pero sí delete

Como referencia del curso: DML: Manipulación de datos con MySQL Comandos DML: Manipulación de datos con MySQL // Autoincremento, patrones y triggers // Video Triggers#1 y Triggers#2

Por qué no se puede crear el trigger de esta manera (con truncate):

delimiter // create trigger tg_facturacion_insert after insert on tb_items_facturas1 for each row begin truncate table tb_facturacion; insert into tb_facturacion select f.fecha, sum(cantidad*precio) as venta_total from tb_factura1 f inner join tb_items_facturas1 i on f.numero = i.numero end //

Y tiene que hacerse con delete

delimiter // create trigger tg_facturacion_insert after insert on tb_items_facturas1 for each row begin delete from tb_facturacion; insert into tb_facturacion select f.fecha, sum(cantidad*precio) as venta_total from tb_factura1 f inner join tb_items_facturas1 i on f.numero = i.numero group by f.fecha; end //

Y en el log de error me indica: Error Code: 1422. Explicit or implicit commit is not allowed in stored function or trigger.

Error el cuál me conlleva también a preguntar si existen instrucciones con commit implicito y explicito, cómo intervienen en este caso.

1 respuesta
solución!

Hola , espero que esté bien.

El error "Error Code: 1422. Explicit or implicit commit is not allowed in stored function or trigger" se debe a que estás intentando ejecutar una instrucción que realiza una operación de "commit" dentro de un trigger, lo cual no está permitido.

Un "commit" en una base de datos es una operación que confirma y finaliza una transacción, haciendo que los cambios realizados en la base de datos sean permanentes. Los triggers, al igual que las funciones almacenadas, se ejecutan dentro del contexto de una transacción. Si se permitiera realizar commits dentro de un trigger, podría causar problemas en la integridad y consistencia de la base de datos.

En tu primer intento de trigger con la instrucción "TRUNCATE", ocurre un commit implícito, ya que "TRUNCATE" es una operación DDL (Data Definition Language) y conlleva un commit automáticamente. Debido a que los commits no están permitidos en triggers, la creación del trigger falla.

Para resolver este problema, debes usar la opción con "DELETE" como en tu segundo intento. La instrucción "DELETE" es una operación DML (Data Manipulation Language), que no conlleva un commit implícito y es segura para usar dentro de un trigger.

En cuanto a tu pregunta sobre instrucciones con commit implícito y explícito, aquí tienes una explicación:

Commit implícito: En algunos sistemas de gestión de bases de datos (DBMS), ciertas operaciones DML realizan un commit implícito automáticamente después de completarse, a menos que estén dentro de una transacción explícita. Es decir, al ejecutar una operación DML como INSERT, UPDATE o DELETE, el DBMS finaliza la transacción actual y hace los cambios permanentes en la base de datos sin que necesites emitir explícitamente un comando COMMIT.

Commit explícito: Un commit explícito se realiza cuando emites explícitamente un comando COMMIT en tu código SQL para finalizar la transacción actual y hacer permanentes los cambios realizados en la base de datos. Por ejemplo, después de realizar una serie de operaciones DML, puedes usar COMMIT para confirmar los cambios y hacer que sean permanentes.

Un saludo.

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios